# cmakedefine替换的意外结果

mo49yndu  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(148)

假设在我的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。
7eumitmz

7eumitmz1#

要获得所需的行为,请不要使用cmakedefine,而是使用cmakedefine01(注意尾部的01)。在您的示例中:

#cmakedefine01 HAVE_GETOPT @HAVE_GETOPT@
#cmakedefine01 STDLIB_HAS_GETOPT @HAVE_GETOPT@

字符串
文档:https://cmake.org/cmake/help/latest/command/configure_file.html

fnx2tebb

fnx2tebb2#

对于#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)

字符串

f2uvfpb9

f2uvfpb93#

configure_fileDocumentation是明确的:
. input lines of the form:

#cmakedefine VAR ...

字符串
将改为:

#define VAR ...


或者:

/* #undef VAR */


这取决于CMake中是否设置了VAR...
只有 VAR 的值有意义,它之后的所有内容都与C无关。在#define#undef之间进行选择。
因此,#cmakedefine HAVE_GETOPT被转换为#define,但#cmakedefine STDLIB_HAS_GETOPT被转换为#undef(因为变量 STDLIB_HAS_GETOPT 没有在CMake代码中设置)。

2w2cym1i

2w2cym1i4#

来获得想要的行为

#define HAVE_GETOPT 1
#define STDLIB_HAS_GETOPT 1

字符串
尝试

#cmakedefine HAVE_GETOPT @HAVE_GETOPT@
#ifdef HAVE_GETOPT
#define STDLIB_HAS_GETOPT ${HAVE_GETOPT}
#endif


.以这种方式使用cmake引用${...}对我来说很有效,#cmakedefine行将像往常一样被cmake处理,下面的3行将输出到带有适当值的. h文件中,以代替${...}
最终结果是,如果在CMakeLists.txt文件中设置了HAVE_GETOPT,则STDLIB_HAS_GETOPT也将被定义为相同的值,相反,如果没有定义HAVE_GETOPT,则STDLIB_HAS_GETOPT也将不被定义。
我还没有看到任何文件(尚未)证实这种行为,但它确实工作。

相关问题