Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cmake中的-D选项中的间距_Cmake - Fatal编程技术网

cmake中的-D选项中的间距

cmake中的-D选项中的间距,cmake,Cmake,-D CMAKE\u C\u编译器是我用来选择编译器的。但是,如果我有打开/关闭的CMake选项,如USEIPHONEFLAG,我需要执行-DUSEIPHONEFLAG=1,-D USEIPHONEFLAG=1不起作用。我想知道-D之后的空格在CMake中是如何工作的。不幸的是,CMake的命令行解析不是非常一致或健壮 这个问题可能取决于传递参数的顺序 在内部,CMake在命令行参数上迭代两次。它第一次查找非缓存参数并跳过任何以-D开头的参数。任何不符合正确参数列表的参数都假定为CMakeLis

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

不幸的是,CMake的命令行解析不是非常一致或健壮

这个问题可能取决于传递参数的顺序

在内部,CMake在命令行参数上迭代两次。它第一次查找非缓存参数并跳过任何以
-D
开头的参数。任何不符合正确参数列表的参数都假定为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对其进行解析,但是变量名随后包含空格,并且在CmakeList文件中不可用

cmake MyProject/CMakeLists.txt "-D Foo=1"  # --> Defines the unusable var ${ Foo}
另一个不一致之处是,其他命令行标志使用或不使用空格(例如
-g
),而其他命令行标志则需要空格(例如
-e


我个人的建议是,除非有必要,否则不要在国旗后面加空格。我想总是最后传递路径也会有帮助,不过如果不添加额外的空格,就不需要这样做。

我总是发现我不能在
-D
之后留下空格。我很惊讶
CMAKE_C_编译器
使用空格。CMake倾向于首先定位GNU编译器,因此如果您试图定位
gcc
,那么它可能会碰巧工作。