CMake似乎忽略了一条线?

时间:2017-06-16 01:37:17

标签: c++ cmake

我有一个CMakeLists.txt文件,包含以下几行:

include(CheckSymbolExists)
check_symbol_exists(alloca stdlib.h;cstdlib ALLOCA_EXISTS)
check_symbol_exists(malloc stdlib.h;cstdlib MALLOC_EXISTS)

但是在CMake输出的相关部分中,所有出现的都是:

...
-- Looking for alloca
-- Looking for alloca - found
...

根本没有关于malloc的内容。 CMake是否忽略了我的路线?或者是其他事情发生了吗?

修改

我甚至试过这个......

unset(CMAKE_REQUIRED_QUIET)

...每次调用check_symbol_exists之前,都没有解决问题。

2 个答案:

答案 0 :(得分:3)

要将列表作为单个参数传递给函数/宏,列表应该用括起来用双引号:

# Double quotes are required around the list argument
check_symbol_exists(alloca "stdlib.h;cstdlib" ALLOCA_EXISTS)

只有当这是最后一个非位置参数时才需要使用list参数的双引号:

# Here double quotes can be omited.
set(A a;b;c)

如果没有双引号,您的代码将被解释为

check_symbol_exists(alloca stdlib.h cstdlib ALLOCA_EXISTS)
check_symbol_exists(malloc stdlib.h cstdlib MALLOC_EXISTS)

cstdlib成为宏的三维参数,表示应存储结果的变量。给定变量是在第一次调用时创建的(检查alloca)。第二次调用(检查malloc)检查变量,发现它已经设置,将其解释为“检查已经执行”,并且什么都不做。

答案 1 :(得分:0)

经过我的CMakeLists文件阅读和文档阅读后,我意识到我的错误是双重的。

首先,我没有把文件列表放在引号中,所以感谢+ Tsyvarev的回答。

我在阅读check_symbol_exists文档时意识到了我的错误的第二部分,并发现了这一点:

  

如果检查需要在C ++中完成,请考虑使用CHECK_CXX_SYMBOL_EXISTS(),它与CHECK_SYMBOL_EXISTS()的作用相同,但在C ++中。

链接:enter image description here

所以我意识到我应该使用check_cxx_symbol_exists,因为check_symbol_exists将无法查看C ++标题。

更改宏调用和导入行后,我的脚本按预期工作。

干杯!