-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是设定Foo的1.
因此,命令行中路径的位置在这里非常重要.
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).
我自己的建议是始终避免在标志之后添加空格,除非它是必需的.我想总是最后传递路径也会有所帮助,但如果不添加额外空格则不需要.
| 归档时间: |
|
| 查看次数: |
6376 次 |
| 最近记录: |