编写CMakeLists.txt的顺序
一、编写技巧
1、先写cmake的版本
在文件开头,指定所需的 CMake 最低版本,以确保项目可以在兼容的 CMake 环境中构建。
// 要求cmake的版本至少是3.5
cmake_minimum_required(VERSION 3.5)
2、写项目名称和语言
使用 project()
命令定义项目名称,并可以指定项目的语言(如 C、C++ 等)。
// 项目名称为 MyProject,使用 C++ 语言
project(my_project_name LANGUAGES CXX)
3、定义选项和配置
option(ENABLE_FEATURE_X "Enable Feature X" ON) # 示例:定义一个选项,默认为 ON
4、查找依赖项
使用 find_package()
命令查找项目所需的外部库或工具。
find_package(OpenCV REQUIRED) # 示例:查找 OpenCV 库
find_package(Boost REQUIRED COMPONENTS filesystem system) # 示例:查找 Boost 库的特定组件
5、包含目录
使用 include_directories()
命令添加额外的头文件搜索路径。
include_directories(${CMAKE_SOURCE_DIR}/include) # 示例:添加项目中的 include 目录
6、源文件和可执行文件
# 示例:定义源文件列表
set(SOURCES
src/main.cpp
src/utils.cpp
)
# 示例:创建可执行文件
add_executable(MyExecutable ${SOURCES})
7、链接库
使用 target_link_libraries()
命令将可执行文件或库与所需的外部库链接。
# 示例:链接 OpenCV 和 Boost 库
target_link_libraries(MyExecutable PRIVATE OpenCV::Core Boost::filesystem Boost::system)
8、编译选项和定义
# 示例:添加编译警告选项
target_compile_options(MyExecutable PRIVATE -Wall -Wextra)
# 示例:添加编译定义
target_compile_definitions(MyExecutable PRIVATE MY_DEFINE=1)
9、安装
使用 install()
命令定义安装规则,以便在构建后安装可执行文件、库或头文件。
# 示例:安装可执行文件到 bin 目录
install(TARGETS MyExecutable DESTINATION bin)
# 示例:安装头文件到 include 目录
install(DIRECTORY include/ DESTINATION include)
10、测试(可选)
如果项目包含测试,可以使用 enable_testing()
和 add_test()
命令设置测试。
enable_testing() # 启用测试
add_test(NAME MyTest COMMAND MyExecutable --test) # 示例:添加测试
二、完整示例
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
option(ENABLE_FEATURE_X "Enable Feature X" ON)
find_package(OpenCV REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem system)
include_directories(${CMAKE_SOURCE_DIR}/include)
set(SOURCES
src/main.cpp
src/utils.cpp
)
add_executable(MyExecutable ${SOURCES})
target_link_libraries(MyExecutable PRIVATE OpenCV::Core Boost::filesystem Boost::system)
target_compile_options(MyExecutable PRIVATE -Wall -Wextra)
target_compile_definitions(MyExecutable PRIVATE MY_DEFINE=1)
install(TARGETS MyExecutable DESTINATION bin)
install(DIRECTORY include/ DESTINATION include)
enable_testing()
add_test(NAME MyTest COMMAND MyExecutable --test)