活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

新手必看CMake安装配置全攻略从零开始掌握跨平台构建工具的安装与配置技巧解决常见问题提高开发效率

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-30 13:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

CMake是一个开源、跨平台的构建自动化工具,它使用简单的平台和编译器独立的配置文件来控制软件编译过程。对于C++开发者来说,掌握CMake是一项必备技能,它能够简化构建过程,使代码更易于在不同平台间移植。本文将带你从零开始,全面了解CMake的安装、配置及使用技巧,帮助你解决常见问题,提高开发效率。

一、CMake简介

1.1 什么是CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。CMake并不直接构建出最终的软件,而是生成标准的构建文件(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依据一般的构建方式使用。

1.2 为什么选择CMake

• 跨平台性:CMake支持Windows、macOS、Linux等多种操作系统
• 简化构建过程:使用简单的CMake脚本控制复杂的构建过程
• 依赖管理:能够轻松管理项目依赖
• 集成性好:与各种IDE和工具链良好集成
• 社区支持:拥有活跃的社区和丰富的文档资源

1.3 CMake与其他构建工具的比较

二、在不同操作系统上安装CMake

2.1 Windows系统上安装CMake

1. 访问CMake官方网站https://cmake.org/download/
2. 下载最新的Windows x64 Installer(.msi文件)
3. 双击运行安装程序,按照向导完成安装
4. 在安装过程中,确保选择”Add CMake to the system PATH for all users”或”Add CMake to the system PATH for current user”选项,这样可以在命令行中直接使用cmake命令

如果你使用Chocolatey或Scoop等Windows包管理器,可以通过以下命令安装:

使用Chocolatey:
  1. choco install cmake
复制代码

使用Scoop:
  1. scoop install cmake
复制代码

打开命令提示符或PowerShell,输入以下命令:
  1. cmake --version
复制代码

如果安装成功,你将看到类似以下的输出:
  1. cmake version 3.25.1
  2. CMake suite maintained and supported by Kitware (kitware.com/cmake).
复制代码

2.2 macOS系统上安装CMake

1. 访问CMake官方网站https://cmake.org/download/
2. 下载最新的macOS x64或ARM64的.dmg文件
3. 双击.dmg文件,将CMake.app拖拽到Applications文件夹
4. 为了在命令行中使用cmake,你需要将CMake的命令行工具添加到PATH中。可以通过以下方式之一实现:运行CMake.app,然后通过菜单”Tools” > “How to Install For Command Line Use”获取安装指令手动创建符号链接:sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
5. 运行CMake.app,然后通过菜单”Tools” > “How to Install For Command Line Use”获取安装指令
6. 手动创建符号链接:sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install

访问CMake官方网站https://cmake.org/download/

下载最新的macOS x64或ARM64的.dmg文件

双击.dmg文件,将CMake.app拖拽到Applications文件夹

为了在命令行中使用cmake,你需要将CMake的命令行工具添加到PATH中。可以通过以下方式之一实现:

• 运行CMake.app,然后通过菜单”Tools” > “How to Install For Command Line Use”获取安装指令
• 手动创建符号链接:sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
  1. sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
复制代码

如果你使用Homebrew包管理器,可以通过以下命令安装:
  1. brew install cmake
复制代码

打开终端,输入以下命令:
  1. cmake --version
复制代码

如果安装成功,你将看到CMake的版本信息。

2.3 Linux系统上安装CMake

使用apt包管理器安装:
  1. sudo apt update
  2. sudo apt install cmake
复制代码

注意:Ubuntu/Debian默认仓库中的CMake版本可能较旧。如果你需要最新版本,可以考虑以下方法:

1. 使用Kitware APT仓库:
  1. wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
  2. sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main'
  3. sudo apt update
  4. sudo apt install cmake
复制代码

1. 使用snap:
  1. sudo snap install cmake --classic
复制代码

使用yum或dnf包管理器安装:

对于CentOS/RHEL:
  1. sudo yum install cmake
复制代码

对于Fedora:
  1. sudo dnf install cmake
复制代码

如果你需要最新版本或者系统包管理器提供的版本不满足需求,可以从源码编译安装:

1. 安装必要的依赖:
  1. # Ubuntu/Debian
  2. sudo apt install build-essential libssl-dev
  3. # CentOS/RHEL/Fedora
  4. sudo yum groupinstall "Development Tools"
  5. sudo yum install openssl-devel
复制代码

1. 下载CMake源码:
  1. wget https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1.tar.gz
  2. tar -zxvf cmake-3.25.1.tar.gz
  3. cd cmake-3.25.1
复制代码

1. 编译并安装:
  1. ./bootstrap
  2. make -j$(nproc)
  3. sudo make install
复制代码

打开终端,输入以下命令:
  1. cmake --version
复制代码

如果安装成功,你将看到CMake的版本信息。

三、CMake基本配置和使用

3.1 CMake基础概念

CMake使用名为CMakeLists.txt的配置文件来定义构建过程。这个文件包含了一系列的命令,用于指定项目名称、版本、依赖关系、编译选项等。

CMake的构建过程通常分为两个阶段:

1. 配置阶段:CMake解析CMakeLists.txt文件,生成构建系统(如Makefile或Visual Studio项目)
2. 构建阶段:使用生成的构建系统实际编译和链接代码

3.2 创建第一个CMake项目

让我们创建一个简单的C++项目,使用CMake进行构建。
  1. my_project/
  2. ├── CMakeLists.txt
  3. ├── include/
  4. │   └── hello.h
  5. └── src/
  6.     ├── hello.cpp
  7.     └── main.cpp
复制代码

include/hello.h:
  1. #ifndef HELLO_H
  2. #define HELLO_H
  3. void sayHello();
  4. #endif // HELLO_H
复制代码

src/hello.cpp:
  1. #include <iostream>
  2. #include "hello.h"
  3. void sayHello() {
  4.     std::cout << "Hello, CMake!" << std::endl;
  5. }
复制代码

src/main.cpp:
  1. #include "hello.h"
  2. int main() {
  3.     sayHello();
  4.     return 0;
  5. }
复制代码
  1. # 指定CMake最低版本要求
  2. cmake_minimum_required(VERSION 3.10)
  3. # 设置项目名称和版本
  4. project(HelloCMake VERSION 1.0)
  5. # 指定C++标准
  6. set(CMAKE_CXX_STANDARD 11)
  7. set(CMAKE_CXX_STANDARD_REQUIRED True)
  8. # 添加头文件搜索路径
  9. include_directories(${PROJECT_SOURCE_DIR}/include)
  10. # 收集源文件
  11. set(SOURCES
  12.     src/hello.cpp
  13.     src/main.cpp
  14. )
  15. # 创建可执行文件
  16. add_executable(hello_cmake ${SOURCES})
复制代码

3.3 构建项目

1. 创建构建目录:
  1. cd my_project
  2. mkdir build
  3. cd build
复制代码

1. 运行CMake配置项目:
  1. cmake ..
复制代码

1. 构建项目:
  1. cmake --build .
复制代码

1. 运行可执行文件:
  1. # Linux/macOS
  2. ./hello_cmake
  3. # Windows
  4. Debug\hello_cmake.exe
复制代码

1. 打开CMake GUI
2. 设置源代码目录和构建目录
3. 点击”Configure”按钮
4. 选择生成器(如Unix Makefiles或Visual Studio)
5. 点击”Generate”按钮生成构建文件
6. 点击”Open Project”按钮打开生成的项目,或使用命令行进行构建

3.4 CMake常用命令和变量

3.5 构建类型

CMake支持多种构建类型,常见的有:

• Debug:包含调试信息,不进行优化
• Release:不包含调试信息,进行优化
• RelWithDebInfo:包含调试信息,同时进行优化
• MinSizeRel:进行优化,但优先考虑最小化二进制大小

可以通过以下方式指定构建类型:

1. 在CMakeLists.txt中设置:
  1. if(NOT CMAKE_BUILD_TYPE)
  2.     set(CMAKE_BUILD_TYPE Release)
  3. endif()
复制代码

1. 在运行CMake时指定:
  1. cmake -DCMAKE_BUILD_TYPE=Debug ..
复制代码

1. 对于多配置生成器(如Visual Studio),在构建时指定:
  1. cmake --build . --config Debug
复制代码

四、常见问题及解决方案

4.1 安装问题

原因:安装时未将CMake添加到系统PATH环境变量中。

解决方案:

1. 重新运行CMake安装程序,确保选择”Add CMake to the system PATH”选项
2. 或手动将CMake的bin目录添加到PATH环境变量中:右键点击”此电脑” > “属性” > “高级系统设置” > “环境变量”在”系统变量”中找到”Path”,点击”编辑”点击”新建”,添加CMake的bin目录路径(如C:\Program Files\CMake\bin)点击”确定”保存更改
3. 右键点击”此电脑” > “属性” > “高级系统设置” > “环境变量”
4. 在”系统变量”中找到”Path”,点击”编辑”
5. 点击”新建”,添加CMake的bin目录路径(如C:\Program Files\CMake\bin)
6. 点击”确定”保存更改

• 右键点击”此电脑” > “属性” > “高级系统设置” > “环境变量”
• 在”系统变量”中找到”Path”,点击”编辑”
• 点击”新建”,添加CMake的bin目录路径(如C:\Program Files\CMake\bin)
• 点击”确定”保存更改

原因:系统默认仓库中的CMake版本可能较旧。

解决方案:

1. 使用Kitware APT仓库安装最新版本(如2.3.1节所述)
2. 从源码编译安装最新版本(如2.3.3节所述)
3. 使用pip安装:
  1. pip install cmake
复制代码

4.2 配置问题

错误信息:
  1. CMake Error: CMAKE_C_COMPILER not found
  2. CMake Error: CMAKE_CXX_COMPILER not found
复制代码

原因:系统上未安装编译器或CMake无法找到编译器。

解决方案:

1. 安装必要的编译工具:Ubuntu/Debian:sudo apt install build-essentialCentOS/RHEL/Fedora:sudo yum groupinstall "Development Tools"Windows: 安装Visual Studio或MinGWmacOS: 安装Xcode命令行工具:xcode-select --install
2. Ubuntu/Debian:sudo apt install build-essential
3. CentOS/RHEL/Fedora:sudo yum groupinstall "Development Tools"
4. Windows: 安装Visual Studio或MinGW
5. macOS: 安装Xcode命令行工具:xcode-select --install
6. 手动指定编译器:

安装必要的编译工具:

• Ubuntu/Debian:sudo apt install build-essential
• CentOS/RHEL/Fedora:sudo yum groupinstall "Development Tools"
• Windows: 安装Visual Studio或MinGW
• macOS: 安装Xcode命令行工具:xcode-select --install

手动指定编译器:
  1. cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
复制代码

错误信息:
  1. CMake Error: Could NOT find OpenSSL (missing: OPENSSL_INCLUDE_DIR OPENSSL_LIBRARY)
复制代码

原因:依赖库未安装或CMake不知道在哪里查找。

解决方案:

1. 安装缺失的库:Ubuntu/Debian:sudo apt install libssl-devCentOS/RHEL/Fedora:sudo yum install openssl-devel
2. Ubuntu/Debian:sudo apt install libssl-dev
3. CentOS/RHEL/Fedora:sudo yum install openssl-devel
4. 手动指定库的路径:

安装缺失的库:

• Ubuntu/Debian:sudo apt install libssl-dev
• CentOS/RHEL/Fedora:sudo yum install openssl-devel

手动指定库的路径:
  1. cmake -DOPENSSL_INCLUDE_DIR=/path/to/openssl/include \
  2.       -DOPENSSL_LIBRARY=/path/to/openssl/lib/libssl.a ..
复制代码

1. 在CMakeLists.txt中设置提示路径:
  1. set(OPENSSL_ROOT_DIR "/path/to/openssl")
  2. find_package(OpenSSL REQUIRED)
复制代码

4.3 构建问题

错误信息:
  1. undefined reference to `function_name'
复制代码

原因:缺少必要的库或源文件。

解决方案:

1. 确保所有必要的源文件已添加到目标中:
  1. add_executable(my_app main.cpp missing_file.cpp)
复制代码

1. 确保链接了所有必要的库:
  1. target_link_libraries(my_app REQUIRED_LIBRARY)
复制代码

1. 检查库的顺序(有些链接器对顺序敏感):
  1. target_link_libraries(my_app lib1 lib2 lib3)
复制代码

原因:缺少Windows SDK或Visual Studio未正确配置。

解决方案:

1. 确保安装了Windows SDK
2. 使用Visual Studio的开发者命令提示符进行构建
3. 或手动指定Windows SDK路径:
  1. cmake -DCMAKE_WINDOWS_KITS_10_DIR="C:\Program Files (x86)\Windows Kits\10" ..
复制代码

4.4 跨平台问题

原因:Windows使用反斜杠\作为路径分隔符,而Unix-like系统使用正斜杠/。

解决方案:
在CMake中始终使用正斜杠/,CMake会自动转换为适合当前平台的格式:
  1. # 正确做法
  2. include_directories(${PROJECT_SOURCE_DIR}/include)
  3. # 错误做法(不跨平台)
  4. include_directories(${PROJECT_SOURCE_DIR}\include)
复制代码

原因:Windows上库文件扩展名为.lib,Unix-like系统上为.a(静态库)或.so(共享库)。

解决方案:
使用CMake的生成器表达式来处理不同平台的库文件扩展名:
  1. target_link_libraries(my_app
  2.     debug ${CMAKE_BINARY_DIR}/lib/my_libd${CMAKE_STATIC_LIBRARY_SUFFIX}
  3.     optimized ${CMAKE_BINARY_DIR}/lib/my_lib${CMAKE_STATIC_LIBRARY_SUFFIX}
  4. )
复制代码

或者,更好的做法是使用target_link_libraries与add_library结合,让CMake自动处理:
  1. add_library(my_lib STATIC src/my_lib.cpp)
  2. target_link_libraries(my_app my_lib)
复制代码

五、提高开发效率的技巧

5.1 使用CMake预设

CMake 3.20及以上版本支持预设(Presets),可以预先定义常用的构建配置,简化构建过程。

在项目根目录创建CMakePresets.json文件:
  1. {
  2.   "version": 2,
  3.   "configurePresets": [
  4.     {
  5.       "name": "debug",
  6.       "displayName": "Debug Config",
  7.       "description": "Debug build with full debug info",
  8.       "generator": "Ninja",
  9.       "binaryDir": "${sourceDir}/build/debug",
  10.       "cacheVariables": {
  11.         "CMAKE_BUILD_TYPE": "Debug",
  12.         "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
  13.       }
  14.     },
  15.     {
  16.       "name": "release",
  17.       "displayName": "Release Config",
  18.       "description": "Release build with optimizations",
  19.       "generator": "Ninja",
  20.       "binaryDir": "${sourceDir}/build/release",
  21.       "cacheVariables": {
  22.         "CMAKE_BUILD_TYPE": "Release"
  23.       }
  24.     }
  25.   ],
  26.   "buildPresets": [
  27.     {
  28.       "name": "debug",
  29.       "configurePreset": "debug"
  30.     },
  31.     {
  32.       "name": "release",
  33.       "configurePreset": "release"
  34.     }
  35.   ]
  36. }
复制代码

1. 列出可用的预设:
  1. cmake --list-presets
复制代码

1. 使用预设配置项目:
  1. cmake --preset debug
复制代码

1. 使用预设构建项目:
  1. cmake --build --preset debug
复制代码

5.2 使用CMake工具文件

CMake工具文件(Toolchain files)可以帮助你为不同的交叉编译场景配置构建环境。

创建一个工具文件,例如toolchains/arm-linux-gnueabihf.cmake:
  1. # 目标系统
  2. set(CMAKE_SYSTEM_NAME Linux)
  3. set(CMAKE_SYSTEM_PROCESSOR arm)
  4. # 指定编译器
  5. set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
  6. set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
  7. # 指定目标环境
  8. set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf)
  9. # 查找程序时只在主机上查找
  10. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  11. # 查找库和头文件时只在目标环境中查找
  12. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  13. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  14. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
复制代码
  1. cmake -DCMAKE_TOOLCHAIN_FILE=toolchains/arm-linux-gnueabihf.cmake ..
复制代码

5.3 使用CMake的包管理功能

CMake支持查找和使用各种第三方库,简化依赖管理。
  1. # 查找Boost库
  2. find_package(Boost 1.66 REQUIRED COMPONENTS filesystem system)
  3. # 查找OpenCV
  4. find_package(OpenCV REQUIRED)
  5. # 链接库到目标
  6. target_link_libraries(my_app
  7.     PRIVATE
  8.         Boost::filesystem
  9.         Boost::system
  10.         ${OpenCV_LIBS}
  11. )
复制代码

CMake 3.11及以上版本提供了FetchContent模块,可以在配置时自动下载和集成依赖:
  1. include(FetchContent)
  2. # 声明依赖
  3. FetchContent_Declare(
  4.     googletest
  5.     GIT_REPOSITORY https://github.com/google/googletest.git
  6.     GIT_TAG main
  7. )
  8. # 下载依赖
  9. FetchContent_MakeAvailable(googletest)
  10. # 使用依赖
  11. target_link_libraries(my_test
  12.     PRIVATE
  13.         gtest
  14.         gtest_main
  15. )
复制代码

5.4 使用CMake的测试功能

CMake集成了CTest测试框架,方便进行单元测试和回归测试。

在CMakeLists.txt中启用测试:
  1. enable_testing()
复制代码
  1. # 添加测试可执行文件
  2. add_executable(my_test test/test.cpp)
  3. # 链接必要的库
  4. target_link_libraries(my_test
  5.     PRIVATE
  6.         my_lib
  7.         gtest
  8.         gtest_main
  9. )
  10. # 添加测试用例
  11. add_test(NAME MyTest COMMAND my_test)
复制代码
  1. # 构建后运行测试
  2. ctest
  3. # 运行特定测试
  4. ctest -R MyTest
  5. # 详细输出
  6. ctest --verbose
复制代码

5.5 使用CMake的安装和打包功能

CMake提供了安装和打包功能,方便软件分发。
  1. # 安装可执行文件
  2. install(TARGETS my_app
  3.     RUNTIME DESTINATION bin
  4. )
  5. # 安装库文件
  6. install(TARGETS my_lib
  7.     LIBRARY DESTINATION lib
  8.     ARCHIVE DESTINATION lib
  9. )
  10. # 安装头文件
  11. install(DIRECTORY include/
  12.     DESTINATION include
  13. )
  14. # 安装其他文件
  15. install(FILES README.md
  16.     DESTINATION share/doc/my_app
  17. )
复制代码
  1. # 设置包信息
  2. set(CPACK_PACKAGE_NAME "MyApp")
  3. set(CPACK_PACKAGE_VERSION "1.0.0")
  4. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My application description")
  5. set(CPACK_PACKAGE_VENDOR "My Company")
  6. # 设置包生成器
  7. set(CPACK_GENERATOR "ZIP;TGZ;DEB;RPM")
  8. # 包含CPack模块
  9. include(CPack)
复制代码
  1. # 构建项目
  2. cmake --build .
  3. # 生成包
  4. cpack
复制代码

5.6 使用CMake与IDE集成

CMake可以与各种IDE集成,提高开发效率。

1. 使用Visual Studio 2017及以上版本,它内置了CMake支持
2. 打开Visual Studio,选择”打开文件夹”,选择包含CMakeLists.txt的项目根目录
3. Visual Studio会自动识别CMake项目并配置 IntelliSense

1. 安装CMake扩展(如”CMake”和”CMake Tools”)
2. 打开项目文件夹
3. 使用命令面板(Ctrl+Shift+P)运行CMake命令:“CMake: Configure”“CMake: Build”“CMake: Debug”
4. “CMake: Configure”
5. “CMake: Build”
6. “CMake: Debug”

• “CMake: Configure”
• “CMake: Build”
• “CMake: Debug”

CLion原生支持CMake项目:

1. 打开CLion
2. 选择”File” > “Open”,选择包含CMakeLists.txt的项目根目录
3. CLion会自动加载和配置CMake项目

5.7 使用CMake的最佳实践

对于大型项目,将CMakeLists.txt分解为多个文件,每个子目录一个:
  1. project/
  2. ├── CMakeLists.txt          # 主配置文件
  3. ├── src/
  4. │   ├── CMakeLists.txt      # 源代码配置
  5. │   ├── module1/
  6. │   │   ├── CMakeLists.txt  # 模块1配置
  7. │   │   └── ...
  8. │   └── module2/
  9. │       ├── CMakeLists.txt  # 模块2配置
  10. │       └── ...
  11. └── tests/
  12.     ├── CMakeLists.txt      # 测试配置
  13.     └── ...
复制代码

主CMakeLists.txt文件:
  1. cmake_minimum_required(VERSION 3.15)
  2. project(MyProject VERSION 1.0)
  3. # 设置C++标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. # 添加子目录
  7. add_subdirectory(src)
  8. add_subdirectory(tests)
复制代码

现代CMake(3.0+)推荐使用基于目标的命令和属性:
  1. # 传统方式(不推荐)
  2. include_directories(include)
  3. add_library(my_lib src/my_lib.cpp)
  4. target_link_libraries(my_app my_lib)
  5. # 现代方式(推荐)
  6. add_library(my_lib src/my_lib.cpp)
  7. target_include_directories(my_lib
  8.     PUBLIC
  9.         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  10.         $<INSTALL_INTERFACE:include>
  11. )
  12. target_link_libraries(my_app
  13.     PRIVATE
  14.         my_lib
  15. )
复制代码

生成器表达式可以在生成时根据配置条件生成不同的构建信息:
  1. target_link_libraries(my_app
  2.     debug
  3.         ${CMAKE_SOURCE_DIR}/libs/debug/lib1.a
  4.     optimized
  5.         ${CMAKE_SOURCE_DIR}/libs/release/lib1.a
  6. )
  7. # 或者使用生成器表达式
  8. target_link_libraries(my_app
  9.     PRIVATE
  10.         $<$<CONFIG:Debug>:${CMAKE_SOURCE_DIR}/libs/debug/lib1.a>
  11.         $<$<CONFIG:Release>:${CMAKE_SOURCE_DIR}/libs/release/lib1.a>
  12. )
复制代码
  1. # 定义一个函数来添加可执行文件
  2. function(add_my_executable name)
  3.     add_executable(${name} ${ARGN})
  4.     target_include_directories(${name}
  5.         PRIVATE
  6.             ${PROJECT_SOURCE_DIR}/include
  7.     )
  8.     target_link_libraries(${name}
  9.         PRIVATE
  10.             common_lib
  11.     )
  12.     install(TARGETS ${name}
  13.         RUNTIME DESTINATION bin
  14.     )
  15. endfunction()
  16. # 使用函数添加可执行文件
  17. add_my_executable(my_app src/main.cpp)
  18. add_my_executable(my_tool src/tool.cpp)
复制代码

六、进阶主题

6.1 自定义查找模块

当需要使用CMake不直接支持的库时,可以创建自定义的Find模块。

创建cmake/FindMyLib.cmake文件:
  1. # 尝试查找头文件
  2. find_path(MYLIB_INCLUDE_DIR
  3.     NAMES mylib.h
  4.     PATHS /usr/include /usr/local/include
  5. )
  6. # 尝试查找库文件
  7. find_library(MYLIB_LIBRARY
  8.     NAMES mylib
  9.     PATHS /usr/lib /usr/local/lib
  10. )
  11. # 处理标准参数
  12. include(FindPackageHandleStandardArgs)
  13. find_package_handle_standard_args(MyLib
  14.     DEFAULT_MSG
  15.     MYLIB_INCLUDE_DIR
  16.     MYLIB_LIBRARY
  17. )
  18. # 如果找到,设置导出变量
  19. if(MYLIB_FOUND)
  20.     set(MYLIB_INCLUDE_DIRS ${MYLIB_INCLUDE_DIR})
  21.     set(MYLIB_LIBRARIES ${MYLIB_LIBRARY})
  22. endif()
  23. # 标记为高级变量
  24. mark_as_advanced(
  25.     MYLIB_INCLUDE_DIR
  26.     MYLIB_LIBRARY
  27. )
复制代码

在CMakeLists.txt中:
  1. # 将cmake目录添加到模块搜索路径
  2. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  3. # 查找库
  4. find_package(MyLib REQUIRED)
  5. # 使用库
  6. target_include_directories(my_app
  7.     PRIVATE
  8.         ${MYLIB_INCLUDE_DIRS}
  9. )
  10. target_link_libraries(my_app
  11.     PRIVATE
  12.         ${MYLIB_LIBRARIES}
  13. )
复制代码

6.2 创建CMake脚本

CMake不仅可以用于构建项目,还可以用于编写脚本执行各种任务。

创建scripts/my_script.cmake文件:
  1. # 设置变量
  2. set(MY_VAR "Hello, CMake Script!")
  3. # 输出消息
  4. message(STATUS ${MY_VAR})
  5. # 执行命令
  6. execute_process(
  7.     COMMAND echo "This is a command output"
  8.     OUTPUT_VARIABLE CMD_OUTPUT
  9. )
  10. message(STATUS "Command output: ${CMD_OUTPUT}")
  11. # 文件操作
  12. file(WRITE output.txt "This is written by CMake script.\n")
  13. # 数学运算
  14. math(EXPR RESULT "5 * 3")
  15. message(STATUS "5 * 3 = ${RESULT}")
复制代码
  1. cmake -P scripts/my_script.cmake
复制代码

6.3 使用CTest进行高级测试

CTest提供了丰富的测试功能,包括并行测试、测试超时、测试依赖等。
  1. # 启用测试
  2. enable_testing()
  3. # 添加测试,设置超时
  4. add_test(NAME MyTest1 COMMAND my_test1)
  5. set_tests_properties(MyTest1
  6.     PROPERTIES
  7.         TIMEOUT 30
  8. )
  9. # 添加测试,设置依赖
  10. add_test(NAME MyTest2 COMMAND my_test2)
  11. set_tests_properties(MyTest2
  12.     PROPERTIES
  13.         DEPENDS MyTest1
  14. )
  15. # 添加测试,设置资源需求
  16. add_test(NAME MyBigTest COMMAND my_big_test)
  17. set_tests_properties(MyBigTest
  18.     PROPERTIES
  19.         RESOURCE_LOCK "big_resource"
  20. )
  21. # 添加测试,设置标签
  22. add_test(NAME MyFeatureTest COMMAND my_feature_test)
  23. set_tests_properties(MyFeatureTest
  24.     PROPERTIES
  25.         LABELS "feature1"
  26. )
复制代码
  1. # 并行运行测试
  2. ctest -j 4
  3. # 运行特定标签的测试
  4. ctest -L feature1
  5. # 运行测试并生成报告
  6. ctest -T Test --output-on-failure
复制代码

6.4 使用CPack进行高级打包

CPack支持多种打包格式和自定义打包内容。
  1. # 设置包信息
  2. set(CPACK_PACKAGE_NAME "MyApp")
  3. set(CPACK_PACKAGE_VERSION "1.0.0")
  4. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My application description")
  5. set(CPACK_PACKAGE_VENDOR "My Company")
  6. set(CPACK_PACKAGE_CONTACT "support@mycompany.com")
  7. # 设置包生成器
  8. set(CPACK_GENERATOR "ZIP;TGZ;DEB;RPM;NSIS")
  9. # 设置DEB包特定信息
  10. set(CPACK_DEBIAN_PACKAGE_MAINTAINER "My Company")
  11. set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-1)")
  12. # 设置RPM包特定信息
  13. set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
  14. set(CPACK_RPM_PACKAGE_GROUP "Development/Tools")
  15. # 设置NSIS(Windows安装程序)特定信息
  16. set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/assets/app.ico")
  17. set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/assets/uninstall.ico")
  18. # 包含CPack模块
  19. include(CPack)
复制代码
  1. # 生成所有类型的包
  2. cpack
  3. # 生成特定类型的包
  4. cpack -G TGZ
  5. # 生成包并显示详细信息
  6. cpack -V
复制代码

七、总结与展望

CMake是一个功能强大的跨平台构建工具,掌握它可以显著提高C++项目的开发效率。本文从CMake的安装配置开始,逐步介绍了基本使用、常见问题解决以及提高开发效率的技巧。通过学习这些内容,你应该能够:

1. 在不同操作系统上安装和配置CMake
2. 创建和管理CMake项目
3. 解决常见的CMake配置和构建问题
4. 使用高级CMake功能提高开发效率
5. 将CMake与各种开发工具集成

随着CMake的不断发展,未来可能会有更多新功能和改进。建议你持续关注CMake的官方文档和社区动态,以便及时了解最新的最佳实践和技术趋势。

7.1 进一步学习的资源

1. CMake官方文档
2. CMake Discourse论坛
3. Professional CMake: A Practical Guide- 一本深入的CMake书籍
4. Effective CMake- CMake最佳实践总结
5. Modern CMake- 现代CMake中文指南

7.2 CMake的未来趋势

1. 更好的C++20模块支持:随着C++20模块的普及,CMake将提供更好的支持
2. 改进的依赖管理:CMake可能会提供更强大的内置依赖管理功能
3. 更快的构建速度:通过优化和并行化进一步提高构建速度
4. 更好的IDE集成:与各种开发工具的更深度集成
5. 简化的语法:可能引入更简洁、更直观的语法,降低学习曲线

通过不断学习和实践,你将能够充分利用CMake的强大功能,构建高效、可维护的C++项目。祝你在CMake的学习和使用过程中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则