CMake中如何在源码中使用generate_product_version生成的头文件?
CMake generate_product_version生成头文件的引用方案与路径选择
一、最佳引用方式
步骤1:在CMake中添加二进制目录到包含路径
通过target_include_directories将生成头文件所在的CMAKE_CURRENT_BINARY_DIR目录添加到目标的包含路径中,让编译时编译器能找到该头文件。示例CMake代码:
# 生成版本信息头文件 generate_product_version( VersionInfo_Core NAME "My Core DLL" VERSION_MAJOR 1 VERSION_MINOR 0 VERSION_PATCH 0 VERSION_BUILD 123 ) # 为你的DLL目标添加二进制目录作为私有包含路径 target_include_directories(YourDLLTarget PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- 这里用
PRIVATE是因为该头文件仅用于目标内部代码,无需对外暴露;如果多个目标需要引用,可根据需求改为PUBLIC或INTERFACE。
步骤2:在代码中直接引用头文件
在src/test.cpp中直接包含生成的头文件即可:
#include "VersionInfo_Core.h" void displayVersion() { // 使用生成的版本宏 std::cout << "Product Version: " << PRODUCT_VERSION_FULL_STR << std::endl; }
二、能否将生成文件放到源码目录?
不推荐这么做,核心原因如下:
- 源码目录应仅存放手动编写的源代码,构建产物放在二进制目录是CMake的标准规范,可避免污染源码仓库
- 不同构建配置(Debug/Release)会生成各自的版本文件,放在源码目录会导致文件被覆盖
- 清理构建时只需删除二进制目录即可,不会影响源码文件
如果确实有特殊需求要放到源码目录,可以通过OUTPUT_DIR参数指定生成路径:
generate_product_version( VersionInfo_Core NAME "My Core DLL" VERSION_MAJOR 1 VERSION_MINOR 0 OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src )
但需要注意:需将生成的VersionInfo_Core.h添加到.gitignore中,避免提交到版本控制;同时不同构建配置会覆盖该文件,可能引发编译问题。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

