目录
CMake 是一个跨平台的自动化构建系统,用于管理软件构建过程。它使用一个名为 CMakeLists.txt
的文本文件来描述构建过程所需的各种指令。CMake 可以生成多种构建系统的文件,如 Makefiles、Xcode 项目文件等,从而简化了跨平台的软件开发。以下是详细的 CMake 教程,包括安装、基本用法和常见任务。
1. 安装 CMake
Windows
- 访问 CMake 的官方网站 cmake.org。
- 下载适合 Windows 的安装程序。
- 运行安装程序并按照提示进行安装。
macOS
-
使用 Homebrew 安装:
bash深色版本
1brew install cmake
-
使用 MacPorts 安装:
bash深色版本
1sudo port install cmake
Linux
- 使用包管理器安装:
-
Debian/Ubuntu:
bash深色版本
1sudo apt-get install cmake
-
CentOS/RHEL:
bash深色版本
1sudo yum install cmake
-
Fedora:
bash深色版本
1sudo dnf install cmake
-
2. 基本用法
创建基本的 CMakeLists.txt 文件
创建一个简单的 CMakeLists.txt
文件,用于构建一个 C++ 程序:
cmake
深色版本
1cmake_minimum_required(VERSION 3.10)
2project(HelloWorld)
3
4add_executable(HelloWorld main.cpp)
解释基本指令
cmake_minimum_required
:指定 CMake 的最低版本要求。project
:定义项目名称。add_executable
:添加可执行文件,参数包括可执行文件的名字和要编译的源文件列表。
构建项目
-
创建构建目录:通常不在源码目录中直接构建,而是创建一个单独的构建目录。
bash深色版本
1mkdir build 2cd build
-
生成 Makefiles/Xcode 项目文件:
-
生成 Makefiles:
bash深色版本
1cmake ..
-
生成 Xcode 项目文件:
bash深色版本
1cmake -G Xcode ..
-
-
编译项目:
-
使用 Make:
bash深色版本
1make
-
使用 Ninja(如果安装了 Ninja):
bash深色版本
1cmake --build .
-
使用 Visual Studio(Windows):
bash深色版本
1cmake --build . --config Release
-
3. 常见任务
添加库
假设你需要链接一个外部库 libfoo
:
cmake
深色版本
1find_package(Foo REQUIRED)
2include_directories(${Foo_INCLUDE_DIRS})
3target_link_libraries(HelloWorld ${Foo_LIBRARIES})
设置编译选项
你可以设置编译器的警告级别和其他选项:
cmake
深色版本
1if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
2 add_definitions(-Wall -Wextra)
3endif()
添加测试
使用 Google Test 框架添加测试:
cmake
深色版本
1enable_testing()
2
3find_package(GTest REQUIRED)
4include_directories(${GTEST_INCLUDE_DIRS})
5link_directories(${GTEST_LIBRARY_DIRS})
6
7add_executable(test_hello test_main.cpp)
8target_link_libraries(test_hello ${GTEST_BOTH_LIBRARIES} HelloWorld)
9add_test(NAME test_hello COMMAND test_hello)
设置安装规则
你可以设置安装规则,以便生成安装脚本:
cmake
深色版本
1install(TARGETS HelloWorld DESTINATION bin)
2install(DIRECTORY include/ DESTINATION include)
4. 高级用法
多配置
如果你需要支持多配置(Debug/Release),可以使用以下方式:
cmake
深色版本
1option(BUILD_TYPE "Build type; one of Debug, Release, RelWithDebInfo, MinSizeRel" Release)
2set(CMAKE_BUILD_TYPE "${BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
使用预处理器宏
你可以在 CMakeLists.txt 中定义预处理器宏:
cmake
深色版本
1add_definitions(-DHELLO_WORLD)
设置编译器版本
你可以指定编译器的版本:
cmake
深色版本
1set(CMAKE_CXX_STANDARD 14)
2set(CMAKE_CXX_STANDARD_REQUIRED True)
5. 实战案例
创建一个包含头文件和源文件的项目
假设你有一个简单的 C++ 项目,包含一个头文件 hello.h
和一个源文件 hello.cpp
:
cmake
深色版本
1cmake_minimum_required(VERSION 3.10)
2project(HelloWorld)
3
4add_library(hello SHARED hello.cpp)
5add_executable(HelloWorld main.cpp)
6target_link_libraries(HelloWorld hello)
创建一个带有子目录的项目
如果你的项目包含多个子目录,可以使用 add_subdirectory
指令:
cmake
深色版本
1cmake_minimum_required(VERSION 3.10)
2project(HelloWorld)
3
4add_subdirectory(src)
5add_subdirectory(libs)
总结
通过上述步骤,你可以使用 CMake 来管理你的构建过程,包括生成构建文件、编译项目、添加库、设置编译选项、添加测试和安装规则等。CMake 的强大之处在于它的灵活性和可扩展性,适用于从小型项目到大型复杂系统的各种场景。
6 CMake 的作用和优势
CMake 是一个跨平台的自动化构建系统,用于管理和生成构建文件(如 Makefiles)。它通过解析 CMakeLists.txt
文件来描述项目的构建逻辑,并能够生成多种构建系统的输出文件,使得开发人员能够在不同的操作系统和编译环境下一致地构建项目。以下是 CMake 的主要作用和优势:
CMake 的作用
-
构建文件生成:
- CMake 可以生成多种构建系统的文件,如 GNU Make、Ninja、Visual Studio 项目文件、Xcode 项目文件等。
- 这使得开发人员能够在不同的操作系统上使用相同的构建逻辑。
-
依赖管理和包查找:
- CMake 提供了一系列函数来查找和管理外部依赖库,如
find_package
和find_library
。 - 它能够自动检测库的存在,并设置相应的编译选项和链接选项。
- CMake 提供了一系列函数来查找和管理外部依赖库,如
-
多语言支持:
- CMake 支持多种编程语言,包括 C、C++、Fortran、Java、Python 等。
- 这使得 CMake 成为了一个通用的构建工具,适用于多种类型的项目。
-
跨平台构建:
- CMake 支持 Windows、Linux、macOS、iOS、Android 等多种操作系统。
- 它能够处理不同平台上的编译器差异,并生成相应的构建文件。
-
高级构建逻辑:
- CMake 支持编写复杂的构建逻辑,如条件编译、循环依赖处理、动态库和静态库的构建等。
- 可以使用 CMake 的宏和函数来实现复杂的构建需求。
-
安装和打包:
- CMake 可以生成安装脚本,使得项目可以被方便地安装到系统中。
- 它还支持生成打包文件,如 Debian 包、RPM 包等。
CMake 的优势
-
跨平台性:
- CMake 的主要优势之一就是其跨平台性。无论是在 Windows、Linux 还是 macOS 上,CMake 都能够生成相应的构建文件,使得项目可以在不同的操作系统上一致地构建。
-
灵活性:
- CMake 的
CMakeLists.txt
文件可以包含非常复杂的逻辑,支持条件语句、循环、宏定义等。 - 这使得 CMake 能够处理各种复杂的构建需求,如动态加载库、条件编译等。
- CMake 的
-
易于学习:
- 尽管 CMake 支持复杂的构建逻辑,但它也有一个相对简单的入门门槛。
- 基本的
CMakeLists.txt
文件可以很快上手,并且随着需求的增长逐步学习更高级的功能。
-
广泛的社区支持:
- CMake 有一个活跃的社区,提供了大量的示例和插件。
- 遇到问题时,可以在 Stack Overflow、GitHub 等平台上找到很多解决方案和支持。
-
强大的查找和配置能力:
- CMake 提供了一系列函数来查找和配置外部库和工具。
- 例如,
find_package
可以帮助查找和配置外部库,并设置相应的编译和链接选项。
-
可扩展性:
- CMake 支持编写自定义的宏和函数,可以扩展 CMake 的功能。
- 这使得 CMake 可以适应不同项目的需求,并且可以根据需要进行定制。
-
持续集成支持:
- CMake 生成的构建文件可以很容易地集成到持续集成(CI)系统中,如 Jenkins、Travis CI 等。
- 这有助于自动化测试和构建过程,提高开发效率。
示例
以下是一个简单的 CMakeLists.txt
文件示例,展示了 CMake 的基本用法:
cmake
深色版本
1cmake_minimum_required(VERSION 3.10)
2project(HelloWorld)
3
4# 设置编译标准
5set(CMAKE_CXX_STANDARD 14)
6set(CMAKE_CXX_STANDARD_REQUIRED True)
7
8# 添加可执行文件
9add_executable(HelloWorld main.cpp)
10
11# 查找外部库
12find_package(Foo REQUIRED)
13include_directories(${Foo_INCLUDE_DIRS})
14target_link_libraries(HelloWorld ${Foo_LIBRARIES})
15
16# 设置安装规则
17install(TARGETS HelloWorld DESTINATION bin)
18install(DIRECTORY include/ DESTINATION include)
总结
CMake 是一个非常强大的构建工具,它不仅能够生成多种构建系统的文件,还支持复杂的构建逻辑和依赖管理。通过使用 CMake,开发人员可以在不同的操作系统和编译环境下一致地构建项目,并且能够处理各种复杂的构建需求。