我有一个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
之前,都没有解决问题。
答案 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 ++中。
所以我意识到我应该使用check_cxx_symbol_exists
,因为check_symbol_exists
将无法查看C ++标题。
更改宏调用和导入行后,我的脚本按预期工作。
干杯!