最近打算写一篇学习并练习CMake的专栏,欢迎大家学习交流
学习步骤
好的,我们来详细展开第一步的内容,以帮助您在学习 CMake 的过程中打下坚实的基础。
第一步:基础知识 1. 安装 CMake
首先,您需要在您的计算机上安装 CMake。具体步骤如下:
2. 了解基础概念
在使用 CMake 之前,了解一些关键概念是非常重要的。以下是一些核心概念的介绍:
项目结构:
目标:
源文件:
编译属性:
练习 第二步:创建第一个项目
好的,让我们具体详细地讨论第二步的内容,以帮助您顺利创建第一个 CMake 项目。
3. 设置项目
在这个步骤中,您将创建一个简单的 CMake 项目,这个项目将包含一个 CMakeLists.txt 文件和一小段 C++ 代码(例如,打印“Hello, World!”)。
设置步骤:
创建项目目录:
创建源文件:
创建 CMakeLists.txt 文件:
练习任务 4. 构建和运行
现在您已经设置了项目文件,接下来需要使用 CMake 构建和运行此项目。
构建步骤:
创建构建目录:
配置 CMake:
构建项目:
运行项目:
实验构建选项
更改 CMakeLists.txt:
第三步:深入学习 CMakeLists.txt
恭喜您能看到这里,让我们继续深入学习第三步,针对 CMakeLists.txt 进行更详细的讲解,同时提升难度。
5. 添加源文件
如果您的项目包含多个源文件,您需要在 CMakeLists.txt 中进行相应的设置。
设置步骤:
扩展项目目录:
创建头文件:
修改源文件:
更新 CMakeLists.txt:
练习任务 6. 使用库
在这一部分,您将学习如何链接外部库,如 pthread 或 Boost。
设置步骤:
链接 pthread 库:
测试多线程:
构建并运行项目:
练习任务 第四步:自定义编译选项和条件编译
在这一阶段,您将学习如何在 CMake 中设置编译选项、定义条件编译,以及如何更有条件地控制构建过程。
7. 自定义编译选项
CMake 允许您为不同的编译器设置特定的编译选项。例如,您可能希望在调试模式下启用更多的警告或开启优化。
设置步骤:
修改 CMakeLists.txt 添加编译选项:
构建并测试:
8. 条件编译
有时,您可能希望根据特定条件编译不同的代码段,例如操作系统、编译器类型或自定义选项。
设置步骤:
添加条件编译:
更新 CMakeLists.txt:
重新构建项目:
9. 启用调试信息
在开发阶段,调试信息非常重要。CMake 提供了简单的方法来启用调试信息。
设置步骤:
设置调试信息选项:
构建并运行测试:
好的,接下来我们进入第五步!在这一阶段,我们将深入了解 CMake 的模块化、包管理以及如何构建更复杂的项目结构。
第五步:模块化与包管理
在大型项目中,组织代码和管理依赖关系是至关重要的。CMake 提供了一些工具,可以帮助您将代码组织到模块中,并管理第三方库和包。
10. 创建模块
将功能分成模块有助于提高代码的可维护性和重用性。特别是在多人开发时,模块化设计有助于减少代码冲突。
设置步骤:
创建一个新的模块:
编写 utils.h 文件:
#ifndef UTILS_H
#define UTILS_H
void printGoodbye();
#endif // UTILS_H
编写 utils.cpp 文件:
#include
#include "utils.h"
void printGoodbye() {
std::cout << "Goodbye, World!" << std::endl;
}
更新 main.cpp 文件:
#include
#include "hello.h"
#include "utils.h"
void printHello() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
printHello();
printGoodbye();
return 0;
}
更新 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
include_directories(include)
set(SOURCES src/main.cpp src/utils.cpp)
find_package(Threads REQUIRED)
add_executable(HelloWorld ${SOURCES})
target_compile_options(HelloWorld PRIVATE
$<$:-Wall -Wextra>
$<$:-Wall -Wextra>
$<$:/W4>
)
构建并测试:
11. 使用 CMake 的包管理
CMake 有助于轻松集成外部库。常见的使用方式是 find_package()。
设置步骤:
查找并使用 Boost 库(假设已安装 Boost):
find_package(Boost REQUIRED COMPONENTS system filesystem)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(HelloWorld Boost::system Boost::filesystem)
endif()
测试 Boost 功能:
12. 使用 CMake 的查找功能
CMake 还允许您自定义查找外部库的路径。您可以创建 Find
.cmake 文件,来指定特定库的查找方式。
创建自定义查找模块:
创建查找模块:
在项目的根目录下,创建 cmake 文件夹,并添加一个新的查找模块文件,例如 FindMyLib.cmake。
编写 FindMyLib.cmake:
find_path(MYLIB_INCLUDE_DIR NAMES mylib.h HINTS ${MYLIB_DIR}/include)
find_library(MYLIB_LIBRARY NAMES mylib HINTS ${MYLIB_DIR}/lib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MyLib DEFAULT_MSG MYLIB_LIBRARY MYLIB_INCLUDE_DIR)
mark_as_advanced(MYLIB_INCLUDE_DIR MYLIB_LIBRARY)
在 CMakeLists.txt 中引用:
set(MYLIB_DIR "/path/to/mylib")
find_package(MyLib REQUIRED)
当然,我们继续进入第六步,这一步关注的是更高级的 CMake 功能,例如自定义命令、自定义目标,以及如何进行测试和安装。
第六步:自定义命令与目标,以及测试与安装
在大型项目中,您可能需要在构建过程中执行特定的操作,或者希望以特定方式管理生成的文件。CMake 允许您定义自定义命令和目标,而这些目标可以用于测试和安装。
13. 自定义命令
自定义命令允许您在构建流程中执行任意命令,比如生成代码、运行脚本等。
设置步骤:
添加自定义命令:
add_custom_command(
OUTPUT generated_file.txt
COMMAND echo "This is a generated file." > generated_file.txt
DEPENDS some_other_file.txt # 依赖文件
COMMENT "Generating a file"
)
添加自定义目标:
add_custom_target(generate ALL DEPENDS generated_file.txt)
重新构建项目:
14. 添加测试支持
CMake 提供了与 CTest 集成的功能,可以轻松添加单元测试。
设置步骤:
添加 testing 模块:
enable_testing()
创建测试可执行文件:
set(TEST_SOURCES test_main.cpp)
add_executable(HelloWorldTests ${TEST_SOURCES})
target_link_libraries(HelloWorldTests PRIVATE HelloWorld)
add_test(NAME HelloWorldTests COMMAND HelloWorldTests)
编写测试 code:
#include
#include "hello.h" // 确保包含需要测试的函数
int main() {
assert(some_function() == expected_value);
return 0;
}
15. 安装目标的设置
通过 CMake,您还可以轻松地安装您的库和可执行文件。
设置步骤:
添加安装规则:
install(TARGETS HelloWorld DESTINATION bin)
install(FILES include/hello.h DESTINATION include)
构建并安装:
make install
16. 使用 CPack 打包项目
CMake 提供了 CPack 工具,可以为项目生成安装包。
设置步骤:
启用 CPack:
include(CPack)
配置 CPack 选项(可选):
set(CPACK_PACKAGE_NAME "HelloWorld")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_GENERATOR "ZIP") # 选择打包格式
生成安装包:
cpack