CMake基础(二) - Cmake进阶
在上一篇基础教程的基础上,这次将介绍一些更进阶的 CMake 功能和常用技巧。
步骤 1: 添加库文件
在许多项目中,您可能需要使用外部库来扩展功能。下面是一个示例,演示如何添加和链接外部库。
假设您的项目需要使用一个名为 "Math" 的数学库。首先,在项目目录下创建一个包含 Math 库源代码的子目录:
- MyProject
- CMakeLists.txt
- src
- main.cpp
- mathlib
- CMakeLists.txt
- math.cpp
- math.h
接下来,编写 mathlib/CMakeLists.txt 文件:
# 添加库文件
add_library(Math math.cpp math.h)
# 设置 Math 库的导出路径
set_target_properties(Math PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
# 添加 Math 库的包含路径
target_include_directories(Math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
然后,在项目的主 CMakeLists.txt 文件中添加以下内容:
# 添加 mathlib 子目录
add_subdirectory(mathlib)
# 链接 Math 库到可执行文件
target_link_libraries(MyExecutable Math)
这样,Math 库将被编译并链接到主项目中。
步骤 2: 添加编译选项
CMake 允许为特定目标或全局设置编译选项。例如,启用特定的编译器警告或优化选项。
在 CMakeLists.txt 文件中添加以下内容,以设置编译选项:
# 全局编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")
# 目标特定编译选项
target_compile_options(MyExecutable PRIVATE -Wextra)
这里,我们通过 set
命令将全局编译选项设置为 -Wall
(启用所有警告)和 -O2
(优化级别 2)。使用 target_compile_options
命令,您可以为特定目标设置更多的编译选项。
步骤 3: 安装规则
如果您希望将编译后的文件安装到系统目录,以供其他项目使用,可以使用 CMake 的安装规则。
在主 CMakeLists.txt 文件中添加以下内容:
# 安装目标
install(TARGETS MyExecutable DESTINATION bin)
# 安装文件
install(FILES README.md DESTINATION share)
这样,通过运行 cmake --install .
命令,您的项目文件将被安装到指定的目录。
步骤 4: 构建可选功能
有时,您可能希望在构建项目时启用或禁用某些可选功能。CMake 提供了选项和变量来实现这一点。
在主 CMakeLists.txt 文件中添加以下内容:
# 设置选项
option(ENABLE_FEATURE_X "Enable Feature X" ON)
# 根据选项配置
if(ENABLE_FEATURE_X)
add_definitions(-DFEATURE_X_ENABLED)
message("Feature X enabled")
else()
message("Feature X disabled")
endif()
这里,我们使用 option
命令创建了一个名为 ENABLE_FEATURE_X
的选项,并默认为打开状态(ON)。根据选项的值,您可以执行相应的操作,例如添加编译定义或输出消息。