#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 */

为什么行为不同?

备注:

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)