1. 单文件编译
该单文件是用于计算两数之和,在文件夹下包含两个文件(main.cpp 以及 CMakeLists.txt)
1.1 main.cpp
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
if (argc < 3) {
cout << "arguments are too less" << endl;
return 1;
}
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
int sum = num1 + num2;
cout <<num1<<"+"<<num2<<"="<<sum<<endl;
system("pause");
return 0;
}
1.2 CMakeLists.txt
最低的版本号
cmake_minimum_required(VERSION 2.6)
project(addition)
message("Project Name:" ${PROJECT_NAME})
add_executable(${PROJECT_NAME} main.cpp)
1.3 编译
cmake .
make
在该路径下会生成一个文件夹(CMakeFiles),三个文件(Makefile, CMakeCache.txt, cmake_install.cmake)以及一个程序(addition)
1.4运行该程序
[user@ console folder]$ ./addition 3 4
3+4=7
2. 多文件编译
2.1 多文件:https://github.com/zhouguiyun-uestc/ParallelFlowDirections.git
此时的文件目录结构为
./ParaDEM
|
+ --------- include
| |
| +--------paradem
+-----------src
|
+---------common
|
+----------flowdir
2.2 paradem下的文件(全是.h头文件)
2.3 common下的文件(全是.cpp源文件)
2.4 flowdir下的文件(既有.h头文件又有.cpp源文件)
2.5 第三方库
该项目该依赖于MPI,GDAL和cereal库。MPI和GDAL库自行编译
2.6 CMakeLists.txt编写
#最低版本要求
cmake_minimum_required(VERSION 2.6)
project (ParallelFlowDir LANGUAGES CXX)
message("Project Name:" ${PROJECT_NAME})
#配置各种编译参数
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_compile_options(-std=c++11 -fpermissive -O3)
#设置执行文件的输出路径。该项目的执行文件的输出路径为该路径下的bin文件夹
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#include_directories 用于包含头文件1
include_directories(${PROJECT_SOURCE_DIR}/ParaDEM/include)
#头文件2
include_directories(${PROJECT_SOURCE_DIR}/ParaDEM/src/flowdir})
#头文件 3
include_directories(${PROJECT_SOURCE_DIR}/ParaDEM)
#aux_source_directory 是搜索该路径下的.cpp源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/ParaDEM/src/common c_files)
aux_source_directory(${PROJECT_SOURCE_DIR}/ParaDEM/src/flowdir c_files)
#找第三方链接库MPI。
find_package(MPI REQUIRED)
set(CMAKE_MPI MPI::MPI_CXX)
#如果 find_package(GDAL REQUIRED) 不能找到 GDAL, 那么就必须手动为GDAL_LIBRARY 设置搜索路径
#set(GDAL_INCLUDE_DIR /share/home/slh/CommSDK/user/gdalBuild/include)
#set(GDAL_LIBRARY /share/home/slh/CommSDK/user/gdalBuild/lib/libgdal.so)
#找第三方链接库GDAL
find_package(GDAL REQUIRED)
message(STATUS " version:${GDAL_VERSION}")
message(STATUS " libraries:${GDAL_LIBRARY}")
message(STATUS " include path:${GDAL_INCLUDE_DIR}")
include_directories(${GDAL_INCLUDE_DIR})
#生成可执行文件
add_executable(${PROJECT_NAME} ${c_files})
#链接GDAL 和MPI
target_link_libraries(${PROJECT_NAME} ${GDAL_LIBRARY} ${CMAKE_MPI})
2.7解释
1.配置各种编译的时候,可以使用set设置,更多详情,请自行搜索。
2.头文件的包含请使用include_directories。
3.搜索源文件请使用aux_source_directory。
4.第三方库的查找使用 find_package。例如我们想找GDAL, 那么 find_package(GDAL), 它会在 /usr/share/cmake/Modules 文件中的FindGDAL.cmake文件中去找GDAL的各种信息。前提是GDAL 是make install的, FindGDAL.cmake中才会有GDAL的各种信息。否则的话,我们需要set自行制定GDAL的相关信息。
5.第三方库的链接用target_link_libraries。
注意,也可以将该项目中的某个文件夹编译成静态库,然后在于其余源文件链接,可以参考:https://blog.csdn.net/cliukai/article/details/90670243
参考
简单的多文件编译:https://blog.csdn.net/cliukai/article/details/90670243
有第三方库的文件编译:https://blog.csdn.net/fb_help/article/details/79593037