1 cmake常用命令
1.1 指定cmake的最小版本(可选)
1
| cmake_minimum_required(VERSION 3.4.1)
|
如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的时候,需要加上这行命令,提醒用户升级到该版本之后再执行cmake。
1.2 设置项目名称(可选)
这个命令不是强制性的,但是最好都加上。
它会引入两个变量test_BINARY_DIR
和test_SOURCE_DIR
,同时,cmake自动定义了两个等价的变量PROJECT_BINARY_DIR
和PROJECT_SOURCE_DIR
。
1.3 设置编译类型
1 2 3
| add_executable(test test.cpp) add_library(compare STATIC compare.cpp) add_library(compare SHARED compare.cpp)
|
通过以上命令生成文件名字,
在Linux下是:
在Windows下是:
- test.exe
- compare.lib
- compare.dll
1.4 指定编译包含的源文件
1.4.1 明确指定包含哪些源文件
1
| add_library(test test.cpp test1.cpp test2.cpp)
|
1.4.2 搜索所有的源文件
1 2
| aux_source_directory(. SRC_LIST) add_library(test ${SRC_LIST})
|
1.4.3 搜索所有的.c和.cpp源文件
1 2
| aux_source_directory(GLOB_RECURSE SRC_LIST *.cpp *.c) add_library(test ${SRC_LIST})
|
1.5 设置包含的目录
1
| include_directories(${PROJECT_SOURCE_DIR})
|
1.6 设置链接库搜索目录
1
| link_directories(${PROJECT_SOURCE_DIR}/build)
|
1.7 设置target需要链接的库
1 2 3 4
| target_link_libraries( demo XXX)
|
1.8 设置变量
1.8.1 set直接设置变量的值
1 2
| set(SRC_LIST main.cpp test.cpp) add_executable(test ${SRC_LIST})
|
1.8.2 set追加设置变量的值
1 2 3
| set(SRC_LIST main.cpp) set(SRC_LIST ${SRC_LIST} test.cpp) add_executable(test ${SRC_LIST})
|
1.8.3 list追加或者删除变量的值
1 2 3 4
| set(SRC_LIST main.cpp) list(APPEND SRC_LIST test.cpp) list(REMOVE_ITEM SRC_LIST main.cpp) add_executable(test ${SRC_LIST})
|
2 常用变量
2.1 预定义变量
PROJECT_SOURCE_DIR
:工程的根目录PROJECT_BINARY_DIR
:运行 cmake 命令的目录,通常是${PROJECT_SOURCE_DIR}/build
PROJECT_NAME
:返回通过 project 命令定义的项目名称CMAKE_CURRENT_SOURCE_DIR
:当前处理的 CMakeLists.txt 所在的路径CMAKE_CURRENT_BINARY_DIR
:target 编译目录CMAKE_CURRENT_LIST_DIR
:CMakeLists.txt 的完整路径CMAKE_CURRENT_LIST_LINE
:当前所在的行CMAKE_MODULE_PATH
:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
,然后可以用INCLUDE命令来调用自己的模块EXECUTABLE_OUTPUT_PATH
:重新定义目标二进制可执行文件的存放位置LIBRARY_OUTPUT_PATH
:重新定义目标链接库文件的存放位置
2.2 环境变量
使用环境变量
写入环境变量
2.3 系统信息
CMAKE_MAJOR_VERSION
:cmake 主版本号,比如 3.4.1 中的 3CMAKE_MINOR_VERSION
:cmake 次版本号,比如 3.4.1 中的 4CMAKE_PATCH_VERSION
:cmake 补丁等级,比如 3.4.1 中的 1CMAKE_SYSTEM
:系统名称,比如 Linux-2.6.22CMAKE_SYSTEM_NAME
:不包含版本的系统名,比如 LinuxCMAKE_SYSTEM_VERSION
:系统版本,比如 2.6.22CMAKE_SYSTEM_PROCESSOR
:处理器名称,比如 i686UNIX
:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwinWIN32
:在所有的 win32 平台下该值为 TRUE,包括 cygwin
2.4 主要开关选项
BUILD_SHARED_LIBS
:这个开关用来控制默认的库编译方式,如果不进行设置,使用add_library
又没有指定库类型的情况下,默认编译生成的库都是静态库。如果set(BUILD_SHARED_LIBS ON
后,默认生成的为动态库CMAKE_C_FLAGS
:设置 C 编译选项,也可以通过指令add_definitions()
添加CMAKE_CXX_FLAGS
:设置 C++ 编译选项,也可以通过指令add_definitions()
添加
3 示例
3.1 单个源文件
只有一个main.c源文件,内容如下:
1 2 3 4 5 6
| #include <iostream>
int main() { std::cout << "Hello, World!" << std::endl; return 0; }
|
编写CmakeLists.txt文件如下:
1 2 3 4 5 6 7 8 9 10 11
| cmake_minimum_required(VERSION 3.23)
project(ctest)
set(CMAKE_CXX_STANDARD 14)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build)
add_executable(ctest main.cpp)
|
3.2 复杂项目
目录结构如下:
1 2 3 4 5 6 7 8
| | +--CMakeLists.txt +--main.cpp +--Box | +--box.h +--box.cpp +--CMakeLists.txt
|
其中,main.cpp、box.h、box.cpp 文件内容如下:
main.cpp:
1 2 3 4 5 6 7 8
| #include <iostream> #include "Box/box.h"
int main() { Box box(1, 2, 3); std::cout << box.getVolume() << std::endl; }
|
box.h:
1 2 3 4 5 6 7 8 9 10 11
| class Box { public: Box(int length, int width, int height);
int getVolume();
private: int _length; int _width; int _height; };
|
box.cpp:
1 2 3 4 5 6 7 8 9 10 11
| #include "box.h"
Box::Box(int length, int width, int height) { _length = length; _width = width; _height = height; }
int Box::getVolume() { return _length * _width * _height; }
|
我们将Box类编译成库文件,供主程序调用,主目录CMakeLists.txt内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| cmake_minimum_required(VERSION 3.23)
project(ctest)
set(CMAKE_CXX_STANDARD 14)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Build)
add_subdirectory(Box)
add_executable(ctest main.cpp)
target_link_libraries(ctest box)
|
Box文件夹下的CMakeLists.txt如下:
1
| add_library(box STATIC box.cpp)
|
参考文章: CMakeLists.txt 语法介绍与实例演练_阿飞__的博客-CSDN博客_cmakelist