假设我的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 */
为什么行为不同?
注意:
答案 0 :(得分:2)
要获得所需的行为,请不要使用cmakedefine
,而是使用cmakedefine01
代替(请注意尾随01
)。在您的示例中:
#cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@
文档:https://cmake.org/cmake/help/latest/command/configure_file.html
答案 1 :(得分:1)
对于STDLIB_HAS_GETOPT
,您不能在第二个参数中使用不同的变量,然后在第一个参数中使用。您必须在运行configure_file
之前定义check_function_exists(getopt HAVE_GETOPT)
set(STDLIB_HAS_GETOPT HAVE_GETOPT)
configure_file(config.h.in config.h @ONLY)
。
<Directory Id="DesktopFolder"/>
答案 2 :(得分:0)
configure_file
,Documentation很明确:
...表格的输入行:
#cmakedefine VAR ...
将替换为:
#define VAR ...
或:
/* #undef VAR */
取决于是否在CMake中设置了VAR ...
只有 VAR 的值才有意义,其后的所有内容都与#define
和#undef
之间的CMake选择无关。
因此,#cmakedefine HAVE_GETOPT
转换为#define
,但#cmakedefine STDLIB_HAS_GETOPT
转换为#undef
(因为变量 STDLIB_HAS_GETOPT 未设置为CMake代码)。