cmake中的-D选项中的间距

vka*_*l11 7 cmake

-D CMAKE_C_COMPILER是我用来选择我的编译器.但是,如果我有打开/关闭的CMake选项USEIPHONEFLAG,我需要这样做-DUSEIPHONEFLAG=1,-D USEIPHONEFLAG=1不起作用.我想知道-D在CMake工作之后的空间.

Fra*_*ser 15

不幸的是,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
Run Code Online (Sandbox Code Playgroud)

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

cmake MyProject/CMakeLists.txt "-D Foo=1"  # --> Defines the unusable var ${ Foo}
Run Code Online (Sandbox Code Playgroud)

另一个不一致是其他命令行标志在有或没有空间(例如-G)的情况下工作,而其他命令行标志需要空间(例如-E).

我自己的建议是始终避免在标志之后添加空格,除非它是必需的.我想总是最后传递路径也会有所帮助,但如果不添加额外空格则不需要.