C++文件中使用CmakeLists中定义的变量的第二种方法

本文介绍如何使用CMakeLists.txt文件定义版本号等变量,并通过配置文件config.h.in生成对应的header文件config.h,实现在C++项目中引用这些变量。

CMakeLists.txt

 

Adding such variables can be implemented by creating a configuration file with the extension h.in in which define directives will be defined, which will be added by constants from CMakeLists.txt in C ++. In this case, the corresponding header file will be generated.

cmake_minimum_required (VERSION 3.8)

project (VariablesProject)

# Add the variables we need
set (VERSION_MAJOR 0)
set (VERSION_MINOR 1)
set (VERSION_PATCH 0)
set (SOFT_VERSION $ {VERSION_MAJOR}. $ {VERSION_MINOR}. $ {VERSION_PATCH})

# Specify the configuration file from which the header file will be generated
configure_file (config.h.in config.h @ONLY)

add_executable ($ {PROJECT_NAME} main.cpp)

# add a directory with header files to see the generated file
include_directories ($ {CMAKE_CURRENT_BINARY_DIR})

config.h.in

The configuration file from which the header file config.h will be generated.

#ifndef CONFIG_H_IN
#define CONFIG_H_IN

#define PROJECT_NAME @ PROJECT_NAME @
#define VERSION_MAJOR "@ VERSION_MAJOR @"
#define VERSION_MINOR "@ VERSION_MINOR @"
#define VERSION_PATCH "@ VERSION_PATCH @"
#define SOFT_VERSION "@ SOFT_VERSION @"

#endif // CONFIG_H_IN

main.cpp

#include <iostream>

#include "config.h" // Add an automatically generated configuration file

int main ()
{
    // Use variables from CMakeLists.txt
    std :: cout << "project name:" << PROJECT_NAME << std :: endl;
    std :: cout << "version:" << SOFT_VERSION << std :: endl;
    std :: cout << "version major:" << VERSION_MAJOR << std :: endl;
    std :: cout << "version minor:" << VERSION_MINOR << std :: endl;
    std :: cout << "version patch:" << VERSION_PATCH << std :: endl;
    return 0;
}

Program output

We get the following output in the console as a result.

project name: VariablesProject
version: 0.1.0
version major: 0
version minor: 1
version patch: 0

UPD

The config.h file will be generated in the build directory, if you want to create it in the source directory, write this

configure_file(config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY)

 

<think>我们正在为Linux环境下的C++项目编写一个标准的CMakeLists.txt文件,用于生成可执行文件。 步骤: 1. 指定CMake的最低版本要求 2. 定义项目名称、版本和使用的语言(C++) 3. 设置C++标准 4. 收集源文件(建议使用显式文件列表或通配符,但注意通配符的缺点) 5. 添加可执行文件目标 6. 设置头文件目录 7. 链接库(如果有) 8. 设置输出目录(可选) 注意:在CMake中,通常不推荐使用aux_source_directory,因为它会捕获目录下所有文件,包括可能不需要的文件。建议显式列出源文件使用file(GLOB)并注意其缺点。 下面是一个标准格式的示例:</think>以下是一个标准的 Linux C++ 项目 CMakeLists.txt 文件格式,用于生成可执行文件: ```cmake cmake_minimum_required(VERSION 3.10) # 指定CMake最低版本[^1][^2] # 项目基本信息配置 project(MyProject # 项目名称 VERSION 1.0.0 # 项目版本 DESCRIPTION "C++ Project" # 项目描述 LANGUAGES CXX) # 使用语言(C++) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) # 使用C++17标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持该标准 set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展 # 源文件配置 file(GLOB SOURCES # 收集源文件(推荐显式列出) src/*.cpp src/*.hpp ) # 添加可执行目标 add_executable(${PROJECT_NAME} # 可执行文件名与项目名相同 ${SOURCES} # 链接所有源文件 ) # 包含目录配置 target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include # 项目头文件目录 /usr/local/include # 系统级头文件目录 ) # 链接库配置 target_link_libraries(${PROJECT_NAME} PRIVATE pthread # POSIX线程库 m # 数学库 ${CMAKE_THREAD_LIBS_INIT} # 线程库(跨平台) ) # 编译选项配置 target_compile_options(${PROJECT_NAME} PRIVATE -Wall # 开启所有警告 -Wextra # 额外警告 -Wpedantic # 严格标准检查 -O2 # 优化级别 ) # 安装配置 install(TARGETS ${PROJECT_NAME} # 安装可执行文件 RUNTIME DESTINATION bin # 安装到系统bin目录 ) ``` ### 关键组件说明: 1. **项目定义** `project()` 命令设置项目元数据,`LANGUAGES CXX` 明确使用 C++[^1] 2. **C++标准配置** 通过 `set(CMAKE_CXX_STANDARD 17)` 强制使用 C++17 标准[^2] 3. **源文件管理** - 推荐显式列出源文件:`add_executable(prog src/main.cpp src/util.cpp)` - 使用 `file(GLOB)` 需注意:当新增文件时需重新运行 CMake 4. **目录结构规范** ```bash project_root/ ├── CMakeLists.txt # 主配置文件 ├── include/ # 头文件目录 │ └── utils.h └── src/ # 源文件目录 ├── main.cpp └── utils.cpp ``` 5. **编译流程** ```bash mkdir build && cd build cmake .. # 生成Makefile make # 编译项目 ./MyProject # 运行程序 ``` 6. **跨平台支持** 通过 `CMAKE_THREAD_LIBS_INIT` 等变量自动适配不同平台的线程库[^3] ### 最佳实践建议: 1. **模块化组织** 大型项目使用 `add_subdirectory()` 拆分模块 ```cmake add_subdirectory(libcore) # 核心库 add_subdirectory(app) # 主程序 ``` 2. **依赖管理** 使用 `find_package()` 引入第三方库: ```cmake find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::filesystem) ``` 3. **生成器表达式** 条件编译不同配置: ```cmake target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:-O0 -g> # Debug配置选项 $<$<CONFIG:Release>:-O3> # Release配置选项 ) ``` > **验证编译**:使用 `cmake --build . --verbose` 查看详细编译命令,确保所有源文件正确包含[^1]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值