cmake中的-D选项中的间距

时间:2013-02-15 02:19:11

标签: cmake

-D CMAKE_C_COMPILER是我用来选择编译器的方法。但是,如果我有USEIPHONEFLAG打开/关闭的CMake选项,我需要执行-DUSEIPHONEFLAG=1-D USEIPHONEFLAG=1不起作用。我想知道-D之后的空间如何在CMake中工作。

2 个答案:

答案 0 :(得分:13)

不幸的是,CMake的命令行解析不是非常一致或强大。

此问题可能取决于您传递参数的顺序。

在内部,CMake迭代命令行参数两次。它第一次寻找非缓存参数并以-D跳过任何开头。任何不适合args列表的行都被认为是CMakeLists.txt文件(或目录或CMakeCache.txt)的路径。

假设只有一条路径通过,并且无法验证该假设。这就是问题所在。如果您已通过-D Foo=1,则-D被视为完整参数并被跳过,Foo=1被视为路径。

在args的第二次迭代中,它现在抓取通过-D给出的值,但在此运行中它正确处理-D之后的空格。因此,它了解-D Foo=1正在设置Foo1

因此,命令行中路径的位置在这里非常重要。

cmake -D Foo=1 MyProject/CMakeLists.txt  # --> Works
cmake MyProject/CMakeLists.txt -D Foo=1  # --> Fails

为了进一步复杂化,您可以将空格用引号括起来并让CMake对其进行解析,但变量名称则包含空格并且在CMakeLists文件中不可用。

cmake MyProject/CMakeLists.txt "-D Foo=1"  # --> Defines the unusable var ${ Foo}

另一个不一致之处是其他命令行标志可以使用或不使用空格(例如-G),而其他命令行标记需要空格(例如-E)。

我自己的建议是始终避免在旗帜后面添加空格,除非是必需的。我想总是最后传递路径也会有所帮助,但如果你不添加额外的空格则不需要这样做。

答案 1 :(得分:0)

http://cmake.org/cmake/help/v2.8.8/cmake.html#command:add_definitions

提供的示例似乎表明应该使用add_definitions而不在一个定义中放置空格。您是否使用add_definitions或在调用cmake时设置编译器?