以下是 CMakeLists 中一些常用关键字及其主要功能的总结:
1. cmake_minimum_required
功能:
- 用于指定 CMake 所需的最低版本,确保项目使用的 CMake 功能可以正常工作。
示例:
cmake_minimum_required(VERSION 3.10)
- 解释:
- 该语句表示此 CMakeLists 文件要求 CMake 的最低版本为 3.10。
2. project
功能:
- 用于设置项目名称,并可同时设置项目版本、描述等信息。
示例:
project(MyProject VERSION 1.0 DESCRIPTION "A simple C++ project")
- 解释:
- 定义了一个名为
MyProject
的项目,版本为 1.0,描述为 “A simple C++ project”。
- 定义了一个名为
3. set
功能:
- 可设置变量的值,用于存储信息,如源文件列表、编译器选项等。
示例:
set(SOURCE_FILES main.cpp helper.cpp)
- 解释:
- 将
main.cpp
和helper.cpp
存储在SOURCE_FILES
变量中,后续可使用${SOURCE_FILES}
引用该变量。
- 将
4. add_executable
功能:
- 从源文件创建可执行文件。
示例:
add_executable(MyExecutable ${SOURCE_FILES})
- 解释:
- 从
SOURCE_FILES
变量中存储的源文件创建一个名为MyExecutable
的可执行文件。
- 从
5. add_library
功能:
- 从源文件创建库文件,可以是静态库(
.a
或.lib
)或共享库(.so
或.dll
)。
- 从源文件创建库文件,可以是静态库(
示例:
add_library(MyLibrary STATIC library.cpp)
- 解释:
- 从
library.cpp
创建一个名为MyLibrary
的静态库。
- 从
6. target_include_directories
功能:
- 为目标(可执行文件或库)添加包含目录,使编译器可以找到头文件。
示例:
target_include_directories(MyExecutable PRIVATE include)
- 解释:
- 为
MyExecutable
可执行文件添加include
目录作为头文件的搜索路径,PRIVATE
表示该包含目录仅用于该目标的编译,不传递给依赖该目标的其他目标。
- 为
7. target_link_libraries
功能:
- 将库链接到目标,使得目标可以使用库中的函数和符号。
示例:
target_link_libraries(MyExecutable PRIVATE MyLibrary)
- 解释:
- 将
MyLibrary
库链接到MyExecutable
可执行文件,PRIVATE
表示仅当前目标需要此链接,不会传递给依赖此目标的其他目标。
- 将
8. include_directories
功能:
- 为整个项目添加包含目录,适用于多个目标。
示例:
include_directories(include)
- 解释:
- 为整个项目添加
include
目录作为头文件搜索路径,该目录可被所有目标使用。
- 为整个项目添加
9. link_directories
功能:
- 为整个项目添加库文件的搜索目录,用于查找库文件。
示例:
link_directories(lib)
- 解释:
- 为整个项目添加
lib
目录作为库文件的搜索目录,在链接时会在该目录查找所需的库文件。
- 为整个项目添加
10. find_package
功能:
- 用于查找外部库的配置文件,使项目可以使用第三方库。
示例:
find_package(Boost REQUIRED)
- 解释:
- 尝试查找 Boost 库,如果找不到,CMake 会报错,因为使用了
REQUIRED
关键字。
- 尝试查找 Boost 库,如果找不到,CMake 会报错,因为使用了
11. add_subdirectory
功能:
- 用于添加子目录,CMake 会在子目录中寻找并处理 CMakeLists 文件。
示例:
add_subdirectory(subdirectory)
- 解释:
- 进入
subdirectory
子目录,并处理其中的 CMakeLists 文件。
- 进入
12. option
功能:
- 用于定义一个选项,用户可以在配置时选择开启或关闭。
示例:
option(USE_FEATURE "Use a certain feature" ON)
- 解释:
- 定义了一个名为
USE_FEATURE
的选项,描述为 “Use a certain feature”,默认开启(ON
)。
- 定义了一个名为
13. configure_file
功能:
- 将输入文件复制到输出文件,并可以进行变量替换,常用于配置文件的生成。
示例:
configure_file(config.in config.h)
- 解释:
- 将
config.in
文件复制到config.h
文件,同时可以根据 CMake 中的变量对config.in
中的占位符进行替换。
- 将
14. install
功能:
- 用于指定安装规则,包括可执行文件、库文件、头文件等的安装位置。
示例:
install(TARGETS MyExecutable DESTINATION bin)
- 解释:
- 将
MyExecutable
可执行文件安装到bin
目录。
- 将
总结
- 项目设置和版本:
cmake_minimum_required
,project
。 - 变量设置和使用:
set
。 - 构建目标:
add_executable
,add_library
。 - 头文件和库文件处理:
target_include_directories
,target_link_libraries
,include_directories
,link_directories
,find_package
。 - 子目录和选项处理:
add_subdirectory
,option
。 - 文件操作和安装规则:
configure_file
,install
。
这些关键字是 CMakeLists 中最常用的部分,合理使用它们可以帮助你有效地管理 C++ 项目的构建、依赖和安装等过程。在使用 CMake 时,还可以根据不同的项目需求使用其他的 CMake 命令和关键字,通过 CMake 的文档可以进一步学习和探索。
以下是一个简单的 CMakeLists 示例,将上述部分关键字结合使用:
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0)
set(SOURCE_FILES main.cpp helper.cpp)
add_executable(MyExecutable ${SOURCE_FILES})
target_include_directories(MyExecutable PRIVATE include)
add_library(MyLibrary STATIC library.cpp)
target_link_libraries(MyExecutable PRIVATE MyLibrary)
install(TARGETS MyExecutable MyLibrary DESTINATION bin)
此示例展示了如何使用 CMake 构建一个简单的 C++ 项目,包括创建可执行文件、静态库,添加头文件目录,链接库文件以及指定安装位置。
CMake 是一个强大的构建工具,这些关键字是构建过程的基本组成部分,合理使用它们可以使项目的构建更加灵活和易于管理。