目录
CMake 的高级特性使其能够应对各种复杂的构建需求和环境。以下是针对你提到的各个方面的详细说明:
1. 自定义 CMake 模块和脚本
自定义模块
CMake 允许创建自定义模块来封装复杂数字逻辑,从而简化主 CMakeLists.txt 文件。这些模块通常是独立的脚本文件,可以包含一系列有用的函数和宏。
示例:创建自定义模块
假设我们创建一个名为 my_module.cmake
的模块,该模块包含一些常用的函数和宏:
cmake
深色版本
1# my_module.cmake
2macro(add_custom_target_with_dependencies name command dependencies)
3 add_custom_target(${name}
4 COMMAND ${command}
5 DEPENDS ${dependencies}
6 )
7endmacro()
8
9function(find_and_link_boost components)
10 find_package(Boost REQUIRED COMPONENTS ${components})
11 if (Boost_FOUND)
12 target_link_libraries(${PROJECT_NAME} Boost::${components})
13 endif()
14endfunction()
然后,在主 CMakeLists.txt
文件中包含这个模块:
cmake
深色版本
1include(my_module.cmake)
2
3add_custom_target_with_dependencies(generate_data gen_data.py data_sources)
4find_and_link_boost(system filesystem)
2. 构建配置和目标
多配置生成器
CMake 支持多配置生成器,如 Visual Studio 和 Xcode,它们允许同时生成多个配置(如 Debug 和 Release)的构建文件。
示例:使用 Visual Studio 生成器
bash
深色版本
1cmake -G "Visual Studio 17 2022" -A x64 ..
定义多个构建目标
CMake 允许在一个项目中定义多个目标,如可执行文件、库等,并可以根据需要进行组合。
示例:定义多个目标
cmake
深色版本
1add_executable(app1 main.cpp)
2add_library(lib1 SHARED lib1.cpp)
3target_link_libraries(app1 lib1)
3. 高级查找和配置
灵活地查找包
CMake 提供了 find_package
命令来查找和配置外部库或框架。
示例:查找和配置 Boost 库
cmake
深色版本
1find_package(Boost REQUIRED COMPONENTS system filesystem)
2include_directories(${Boost_INCLUDE_DIRS})
3target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
配置构建选项
可以使用 CMake 的 option
命令来配置构建时的选项。
示例:配置构建选项
cmake
深色版本
1option(BUILD_TESTS "Build the tests target" OFF)
2if(BUILD_TESTS)
3 enable_testing()
4 add_subdirectory(tests)
5endif()
4. 生成自定义构建步骤
添加自定义命令
CMake 允许添加自定义命令来执行额外的操作,如预处理数据文件。
示例:添加自定义命令
cmake
深色版本
1add_custom_command(
2 OUTPUT data.h
3 COMMAND gen_data.py --output data.h
4 DEPENDS gen_data.py
5)
6add_custom_target(generate_data ALL DEPENDS data.h)
添加自定义目标
可以创建自定义目标,这些目标可以在构建过程中执行特定任务。
示例:添加自定义目标
cmake
深色版本
1add_custom_target(doc
2 COMMAND doxygen Doxyfile
3 SOURCES Doxyfile
4 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
5)
5. 跨平台和交叉编译
支持不同平台
CMake 支持跨平台构建,可以在不同的操作系统上构建相同的应用程序。
示例:配置跨平台编译
cmake
深色版本
1set(CMAKE_SYSTEM_NAME Linux)
2set(CMAKE_SYSTEM_PROCESSOR arm)
3set(CMAKE_C_COMPILER /path/to/arm-linux-gcc)
4set(CMAKE_CXX_COMPILER /path/to/arm-linux-g++)
交叉编译
CMake 支持交叉编译,可以在一个平台上编译针对另一个平台的代码。
示例:配置交叉编译
cmake
深色版本
1set(CMAKE_SYSTEM_NAME Linux)
2set(CMAKE_SYSTEM_PROCESSOR arm)
3set(CMAKE_CROSSCOMPILING TRUE)
4set(CMAKE_FIND_ROOT_PATH /path/to/rootfs)
6. 目标属性和配置
设置和修改目标的属性
CMake 提供了一系列命令来设置和修改目标的属性,如编译标志、链接库等。
示例:设置目标属性
cmake
深色版本
1target_compile_features(my_program PRIVATE cxx_std_17)
2target_include_directories(my_program PRIVATE include)
3target_link_libraries(my_program PRIVATE lib1)
总结
CMake 的高级特性使其成为一个强大且灵活的构建工具,适用于多种复杂的构建场景。通过自定义模块和脚本、配置多目标构建、高级查找和配置、自定义构建步骤、跨平台和交叉编译以及目标属性配置,可以极大地扩展 CMake 的功能,满足各种项目需求。