无法导出cmake PROJECT_VERSION_MAJOR,因为它等于零

Laz*_*eus 7 c++ versioning cmake

我在将cmake PROJECT_VERSION_MAJOR变量导出到config.h文件时遇到问题.在我的主要内容CMakeLists.txt我通过调用project()CMakeLists.txt文件根据cmake文档设置此变量:

cmake_minimum_required(VERSION 3.2.2)
cmake_policy(SET CMP0048 NEW)

set(PROJECT "SampleName")

project(${PROJECT}
    VERSION "0.0.0")

configure_file(${CMAKE_SOURCE_DIR}/cmake/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
Run Code Online (Sandbox Code Playgroud)

通过configure_file()invokation我试图将一些cmake变量导出config.h到头文件.请看看我的config.h.cmake.file:

#ifndef CONFIG_H
#define CONFIG_H

#cmakedefine PROJECT "@PROJECT@"

#cmakedefine PROJECT_VERSION "@PROJECT_VERSION@"

#cmakedefine PROJECT_VERSION_MAJOR "@PROJECT_VERSION_MAJOR@"

#cmakedefine PROJECT_VERSION_MINOR "@PROJECT_VERSION_MINOR@"

#cmakedefine PROJECT_VERSION_PATCH "@PROJECT_VERSION_PATCH@"

#endif
Run Code Online (Sandbox Code Playgroud)

cmake ..在我的构建目录中运行命令后config.h创建,但它看起来像这样:

#ifndef CONFIG_H
#define CONFIG_H

#define PROJECT "SampleName"

#define PROJECT_VERSION "0.0.0"

/* #undef PROJECT_VERSION_MAJOR */

/* #undef PROJECT_VERSION_MINOR */

/* #undef PROJECT_VERSION_PATCH */

#endif
Run Code Online (Sandbox Code Playgroud)

我想这个行为的原因是在cmake文档中关于该configure_file()函数的注意事项:

复制一个文件到一个文件和替代变量值作为引用@VAR@${VAR}在输入文件内容.每个变量引用将替换为变量的当前值,如果未定义变量,则替换为空字符串.此外,输入行的形式如下:

#cmakedefine VAR ...

将被替换为:

#define VAR ...

要么:

/* #undef VAR */

取决于是否VAR在CMake中设置为任何不被 命令视为伪常量的if().在”...”对变量名后的线的内容,如果有的话,被处理为以上.表单的输入文件#cmakedefine01 VAR行将替换为任一 #define VAR 1#define VAR 0类似.

问题是,我可以导出PROJECT_VERSION_MAJOR等于零的cmake 变量吗?或者我注定要PROJECT_VERSION在我的代码中解析我的定义?

在应用hank的建议后,新生成的文件如下所示:

#ifndef CONFIG_H
#define CONFIG_H

#define PROJECT "SampleName"

#define PROJECT_VERSION "0.0.0"

#define PROJECT_VERSION_MAJOR "0"

#define PROJECT_VERSION_MINOR "0"

#define PROJECT_VERSION_PATCH "0"

#endif
Run Code Online (Sandbox Code Playgroud)

han*_*ank 6

我认为在你的情况下你不应该使用#cmakedefine指令.使用简单#define代替:

#ifndef CONFIG_H
#define CONFIG_H

#define PROJECT "@PROJECT@"

#define PROJECT_VERSION "@PROJECT_VERSION@"

#define PROJECT_VERSION_MAJOR "@PROJECT_VERSION_MAJOR@"

#define PROJECT_VERSION_MINOR "@PROJECT_VERSION_MINOR@"

#define PROJECT_VERSION_PATCH "@PROJECT_VERSION_PATCH@"

#endif
Run Code Online (Sandbox Code Playgroud)