假设在我的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。
4条答案
按热度按时间7eumitmz1#
要获得所需的行为,请不要使用
cmakedefine
,而是使用cmakedefine01
(注意尾部的01
)。在您的示例中:字符串
文档:https://cmake.org/cmake/help/latest/command/configure_file.html
fnx2tebb2#
对于
#cmakedefine
,你不能在第二个参数和第一个参数中使用不同的变量。你必须在运行configure_file
之前定义STDLIB_HAS_GETOPT
。字符串
f2uvfpb93#
configure_file
的Documentation是明确的:. input lines of the form:
字符串
将改为:
型
或者:
型
这取决于CMake中是否设置了VAR...
只有 VAR 的值有意义,它之后的所有内容都与C无关。在
#define
和#undef
之间进行选择。因此,
#cmakedefine HAVE_GETOPT
被转换为#define
,但#cmakedefine STDLIB_HAS_GETOPT
被转换为#undef
(因为变量 STDLIB_HAS_GETOPT 没有在CMake代码中设置)。2w2cym1i4#
来获得想要的行为
字符串
尝试
型
.以这种方式使用cmake引用${...}对我来说很有效,#cmakedefine行将像往常一样被cmake处理,下面的3行将输出到带有适当值的. h文件中,以代替${...}
最终结果是,如果在CMakeLists.txt文件中设置了HAVE_GETOPT,则STDLIB_HAS_GETOPT也将被定义为相同的值,相反,如果没有定义HAVE_GETOPT,则STDLIB_HAS_GETOPT也将不被定义。
我还没有看到任何文件(尚未)证实这种行为,但它确实工作。