2013-02-15 195 views
3

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

+0

我一直发现''D'后面不能留下空格。我很惊讶'CMAKE_C_COMPILER'有一个空间。 CMake倾向于首先找到GNU编译器,所以如果你试图找到'gcc',那么它可能巧合地工作。 – SethMMorton 2013-05-05 05:20:26

回答

0

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

提供的例子似乎表明,add_definitions应该没有把一个定义范围内的空间内使用。您是使用add_definitions还是在调用cmake时设置了编译器?

+0

我认为OP是指CMake的参数;当你调用CMake本身时通过的,而不是通过'add_definitions'设置的预处理器定义。 – Fraser 2013-06-19 02:28:42

6

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

此问题可能是您传递参数的顺序。

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

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

在通过参数的第二次迭代中,它现在获取通过-D给出的值,但在此运行中它正确处理了-D之后的空格。所以它明白正在设置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)。

我自己的建议是总是避免在标志后面加一个空格,除非是必需的。我想总是通过最后的路径也会有所帮助,但如果不添加额外的空格,则不需要这样做。