-D CMAKE_C_COMPILER
是我用来选择编译器的方法。但是,如果我有USEIPHONEFLAG
打开/关闭的CMake选项,我需要执行-DUSEIPHONEFLAG=1
,-D USEIPHONEFLAG=1
不起作用。我想知道-D
之后的空间如何在CMake中工作。
答案 0 :(得分:13)
不幸的是,CMake的命令行解析不是非常一致或强大。
此问题可能取决于您传递参数的顺序。
在内部,CMake迭代命令行参数两次。它第一次寻找非缓存参数并以-D
跳过任何开头。任何不适合args列表的行都被认为是CMakeLists.txt文件(或目录或CMakeCache.txt)的路径。
假设只有一条路径通过,并且无法验证该假设。这就是问题所在。如果您已通过-D Foo=1
,则-D
被视为完整参数并被跳过,Foo=1
被视为路径。
在args的第二次迭代中,它现在抓取通过-D
给出的值,但在此运行中它正确处理-D
之后的空格。因此,它了解-D Foo=1
正在设置Foo
到1
。
因此,命令行中路径的位置在这里非常重要。
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时设置编译器?