#cmakedefine 替换的意外结果
Unexpected result from #cmakedefine substitution
假设在我的 CMakeLists.txt
中我有:
check_function_exists(getopt HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)
在 config.h.in
我有:
#cmakedefine HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine STDLIB_HAS_GETOPT @HAVE_GETOPT@
我希望看到
#define HAVE_GETOPT 1
#define STDLIB_HAS_GETOPT 1
通过后。相反,我得到:
#define HAVE_GETOPT 1
/* #undef STDLIB_HAS_GETOPT */
为什么行为不同?
备注:
- 使用 cMake v3.5.1 和 GNU/Linux Mint 18.3 内核 4.10。
Documentation 对于 configure_file
很清楚:
... 形式的输入行:
#cmakedefine VAR ...
将被替换为:
#define VAR ...
或:
/* #undef VAR */
取决于是否在 CMake 中设置了 VAR ...
只有VAR的值有意义,后面的一切都与CM无关在#define
和#undef
之间选择。
因此,#cmakedefine HAVE_GETOPT
被转换为 #define
,但 #cmakedefine STDLIB_HAS_GETOPT
被转换为 #undef
(因为变量 STDLIB_HAS_GETOPT 未在 CMake 代码中设置。
要获得所需的行为,请不要使用 cmakedefine
,而应使用 cmakedefine01
(注意结尾的 01
)。在你的例子中:
#cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@
文档:https://cmake.org/cmake/help/latest/command/configure_file.html
对于#cmakedefine
,您不能在第二个参数中使用与第一个参数中不同的变量。您必须在 运行 configure_file
.
之前定义 STDLIB_HAS_GETOPT
check_function_exists(getopt HAVE_GETOPT)
set(STDLIB_HAS_GETOPT HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)
假设在我的 CMakeLists.txt
中我有:
check_function_exists(getopt HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)
在 config.h.in
我有:
#cmakedefine HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine STDLIB_HAS_GETOPT @HAVE_GETOPT@
我希望看到
#define HAVE_GETOPT 1
#define STDLIB_HAS_GETOPT 1
通过后。相反,我得到:
#define HAVE_GETOPT 1
/* #undef STDLIB_HAS_GETOPT */
为什么行为不同?
备注:
- 使用 cMake v3.5.1 和 GNU/Linux Mint 18.3 内核 4.10。
Documentation 对于 configure_file
很清楚:
... 形式的输入行:
#cmakedefine VAR ...
将被替换为:
#define VAR ...
或:
/* #undef VAR */
取决于是否在 CMake 中设置了 VAR ...
只有VAR的值有意义,后面的一切都与CM无关在#define
和#undef
之间选择。
因此,#cmakedefine HAVE_GETOPT
被转换为 #define
,但 #cmakedefine STDLIB_HAS_GETOPT
被转换为 #undef
(因为变量 STDLIB_HAS_GETOPT 未在 CMake 代码中设置。
要获得所需的行为,请不要使用 cmakedefine
,而应使用 cmakedefine01
(注意结尾的 01
)。在你的例子中:
#cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@
文档:https://cmake.org/cmake/help/latest/command/configure_file.html
对于#cmakedefine
,您不能在第二个参数中使用与第一个参数中不同的变量。您必须在 运行 configure_file
.
STDLIB_HAS_GETOPT
check_function_exists(getopt HAVE_GETOPT)
set(STDLIB_HAS_GETOPT HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)