cmake编译单/多文件

1. 单文件编译

该单文件是用于计算两数之和,在文件夹下包含两个文件(main.cpp 以及 CMakeLists.txt)

cmake编译单/多文件_第1张图片
image.png

1.1 main.cpp

#include
#include
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 < 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)


cmake编译单/多文件_第2张图片
image.png

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头文件)

cmake编译单/多文件_第3张图片
image.png

2.3 common下的文件(全是.cpp源文件)

cmake编译单/多文件_第4张图片
image.png

2.4 flowdir下的文件(既有.h头文件又有.cpp源文件)

cmake编译单/多文件_第5张图片
image.png

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

你可能感兴趣的:(cmake编译单/多文件)