1. Start
1.1 构建简单工程
cmake_minimum_required(VERSION 3.0)
project(Step1)
add_executable(Step1 main.cpp)
- 设置cmake最低版本要求
- 设置工程名字
- 设置工程生成可执行程序
2. 声明 C++ Standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
- 如果我们用到了c++11新特性,就需要在CMakeLists.txt中增加CXX标准的声明,注意需要在
add_executable()
之前。
3. 声明版本和配置头文件
有时候我们需要一个变量定义在CMakeLists.txt中,而在源文件中又想使用这个变量。其中一种实现方式是通过可配置的头文件。config.h.in
是一个用于生成配置头文件的模板文件,通常用来定义一些编译时配置的宏。具体步骤如下:
3.1 创建 config.h.in
文件
首先,创建一个 config.h.in
文件,它通常包含一些占位符,将来会被 CMake 用于生成实际的 config.h
文件。例如:
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H
/* Define the version number */
#define VERSION "@PACKAGE_VERSION@"
3.2 在 CMakeLists.txt
中配置 CMake
在 CMakeLists.txt
文件中,配置 CMake 以使用 config.h.in
文件生成实际的 config.h
文件。这通常涉及以下几个步骤:
3.2.1 添加 config.h.in
文件
configure_file(config.h.in config.h)
configure_file
命令会将 config.h.in
文件处理成 config.h
文件。占位符(如 @PACKAGE_VERSION@
)会被相应的值替换。
3.2.2 设置 CMake 变量
你可以使用 set
命令在 CMake 中定义一些变量,这些变量会被替换到 config.h
文件中。例如:
set(PACKAGE_VERSION "1.0.0")
3.2.3 配置 CMakeLists.txt
一个完整的例子可能如下所示:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 设置一些变量
set(PACKAGE_VERSION "1.0.0")
# 配置生成 config.h 文件
configure_file(config.h.in config.h)
# 添加源文件和可执行文件
add_executable(my_executable main.cpp)
# 包含生成的 config.h 文件的路径
target_include_directories(my_executable PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
3.3 使用 config.h
文件
在你的源代码中,包含 config.h
文件,以便使用在 config.h.in
中定义的宏:
#include "config.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
int main() {
// 使用 VERSION 宏
std::cout << "Version: " << VERSION << std::endl;
return 0;
}
3.4 生成和构建项目
运行 CMake 以生成构建系统,并编译你的项目。你可以在构建目录中执行以下命令:
cmake ..
make
总结
- 创建
config.h.in
:定义你想要的宏和占位符。 - 配置 CMake:在
CMakeLists.txt
中使用configure_file
命令生成config.h
文件。 - 设置变量:在 CMake 中设置你希望在
config.h
中定义的宏的值。 - 使用
config.h
:在源代码中包含并使用这些宏。
这样,你可以灵活地控制代码中不同的配置选项,并使得你的项目能够根据不同的构建配置进行调整。