【CMake】CMake 常用语法总结
引言
CMake 是一个跨平台的自动化构建系统生成工具,用于管理软件构建过程。
目录
一、基础命令
二、文件与目录管理
三、链接控制
四、编译选项控制
五、条件控制与循环
六、安装规则
七、生成配置文件
八、常用变量
九、生成器表达式(高级)
附:示例
一、基础命令
-
项目定义
cmake_minimum_required(VERSION 3.10) # 指定最低CMake版本 project(MyProject # 项目名称VERSION 1.0.0 # 项目版本LANGUAGES C CXX) # 使用语言(C/C++)
-
变量操作
set(MY_VAR "value") # 定义变量 set(SOURCES src/main.cpp src/util.cpp) # 设置文件列表 message("Variable value: ${MY_VAR}") # 打印变量
-
添加构建目标
add_executable(my_app ${SOURCES}) # 创建可执行文件 add_library(my_lib STATIC ${SOURCES}) # 创建静态库 add_library(my_shared SHARED ${SOURCES}) # 创建动态库
二、文件与目录管理
-
包含头文件目录
include_directories(include) # 全局包含目录 target_include_directories(my_lib # 目标专属包含目录PUBLIC include # PUBLIC: 目标及其使用者都可见PRIVATE src # PRIVATE: 仅目标内部可见 )
-
文件操作
file(GLOB SOURCES "src/*.cpp") # 通配符获取文件列表 file(GLOB_RECURSE HEADERS "include/**/*.h") # 递归查找
-
添加子目录
add_subdirectory(src) # 添加子目录(需有CMakeLists.txt)
三、链接控制
-
链接库文件
target_link_libraries(my_app # 链接库到可执行文件PRIVATE my_lib # PRIVATE: 内部依赖PUBLIC my_shared # PUBLIC: 传递依赖 )
-
查找系统库
find_package(OpenCV REQUIRED) # 查找OpenCV target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})
四、编译选项控制
-
编译器标志
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2") # 全局标志 target_compile_options(my_app PRIVATE -fPIC) # 目标专属标志
-
C++标准设置
set(CMAKE_CXX_STANDARD 17) # 全局C++标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持该标准
-
预处理器定义
add_definitions(-DDEBUG_MODE) # 全局定义 target_compile_definitions(my_app PRIVATE USE_FEATURE_X) # 目标专属
五、条件控制与循环
-
条件语句
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")message("Building on Linux") elseif(WIN32)message("Building on Windows") else()message("Unknown system") endif()
-
循环语句
foreach(source ${SOURCES})message("Processing: ${source}") endforeach()
六、安装规则
install(TARGETS my_app # 安装目标RUNTIME DESTINATION bin # 可执行文件 -> /usr/binLIBRARY DESTINATION lib # 动态库 -> /usr/libARCHIVE DESTINATION lib/static) # 静态库 -> /usr/lib/staticinstall(DIRECTORY include/ DESTINATION include) # 安装头文件
install(FILES README.md DESTINATION doc) # 安装单个文件
七、生成配置文件
configure_file( # 模板文件生成config.h.in # 输入模板${CMAKE_BINARY_DIR}/config.h # 输出文件
)
八、常用变量
变量名 | 描述 |
---|---|
CMAKE_SOURCE_DIR | 源码根目录 |
CMAKE_BINARY_DIR | 构建目录 (build) |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在目录 |
PROJECT_NAME | 项目名称 |
CMAKE_BUILD_TYPE | 构建类型 (Debug/Release) |
CMAKE_INSTALL_PREFIX | 安装前缀 (/usr/local) |
九、生成器表达式(高级)
target_include_directories(my_appPUBLIC$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include> # 构建时包含$<INSTALL_INTERFACE:include> # 安装时包含
)
附:完整示例
目录结构
demo/├── CMakeLists.txt├── main.c└── hello.c
main.c文件
#include <stdio.h>extern void hello();int main() {printf("This is main!\n");hello();return 0;
}
hello.c 文件
#include <stdio.h>void hello() {printf("%s: hello world!\n", __func__);
}
CMakeLists.txt
文件
# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.10)# 项目名称
project(DemoProject)# 设置 C 编译标准
set(CMAKE_C_STANDARD 99)# 添加可执行文件,指定源文件
add_executable(demo main.c hello.c)
执行命令
cd demo/
mkdir build
cd build
cmake ..
make
./demo
执行结果
raspberrypi:~/test/demo $ mkdir build
raspberrypi:~/test/demo $ cd build/
raspberrypi:~/test/demo/build $ cmake ..
-- The C compiler identification is GNU 12.2.0
-- The CXX compiler identification is GNU 12.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hjh/test/demo/build
raspberrypi:~/test/demo/build $ make
[ 33%] Building C object CMakeFiles/demo.dir/main.c.o
[ 66%] Building C object CMakeFiles/demo.dir/hello.c.o
[100%] Linking C executable demo
[100%] Built target demo
hjh@raspberrypi:~/test/demo/build $ ./demo
This is main!
hello: hello world!
raspberrypi:~/test/demo/build $