【问题标题】:spacing in -D option in cmakecmake中-D选项中的间距
【发布时间】:2013-02-15 02:19:10
【问题描述】:

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

【问题讨论】:

  • 我一直发现-D后面不能留空格。我很惊讶CMAKE_C_COMPILER 与空间合作。 CMake 倾向于首先定位 GNU 编译器,因此如果您试图定位 gcc,那么它可能会巧合地工作。

标签: cmake


【解决方案1】:

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

这个问题可能与您传递参数的顺序有关。

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

假设只有一条路径通过,并且没有做任何事情来验证该假设。问题就在这里。如果您传递了-D Foo=1,则-D 被视为一个完整的参数并被跳过,Foo=1 被视为一个路径。

在通过 args 的第二次迭代中,它现在获取通过 -D 给出的值,但在这次运行中,它正确处理了 -D 之后的空格。所以它知道-D Foo=1Foo 设置为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)。

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

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2011-04-23
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2014-09-20
    相关资源
    最近更新 更多