使用带有空格的 CMake 的 include_directories 命令

Raf*_*fid 5 cmake llvm

我正在使用 CMake 来构建我的项目,并且有以下行:

include_directories(${LLVM_INCLUDE_DIRS})
Run Code Online (Sandbox Code Playgroud)

在计算 后LLVM_INCLUDE_DIRS,计算结果为:

include_directories(C:\Program Files\LLVM\include)
Run Code Online (Sandbox Code Playgroud)

问题是这被认为是两个包含目录,“C:\Program”和“Files\LLVM\include”。

知道如何解决这个问题吗?我尝试使用引号,但没有成功。

编辑:事实证明问题出在文件中llvm-3.0\share\llvm\cmake\LLVMConfig.cmake。我将以下路径用引号括起来,问题就解决了:

set(LLVM_INSTALL_PREFIX C:/Program Files/LLVM)
set(LLVM_INCLUDE_DIRS ${LLVM_INSTALL_PREFIX}/include)
set(LLVM_LIBRARY_DIRS ${LLVM_INSTALL_PREFIX}/lib)
Run Code Online (Sandbox Code Playgroud)

Joh*_* S. 6

在 CMake 中,

  • 空格是列表分隔符(如;),
  • 评估变量名基本上是用变量名的内容替换变量名
  • \是一个转义字符(要获得该符号,也需要对其进行转义)

所以,在你的例子中,include_directories(C:\\Pogram Files\\LLVM\\include)

include_directories( C:\\Program;Files\\LLVM\\include)
Run Code Online (Sandbox Code Playgroud)

即包含两个项目的列表。为了避免这种情况,要么

  • 也逃避空白:

    include_directories( C:\\Program\ Files\\LLVM\\include)或者

  • 用引号将路径引起来:

    include_directories( "C:\\Program Files\\LLVM\\include")

显然,第二个选项是更好的选择

  • 更简单、更容易阅读
  • 可以与您的示例中的变量评估一起使用(因为评估结果随后被引号括起来,因此被视为单个项目)

    include_directories("${LLVM_INCLUDE_DIRS}")

如果 是多个目录的列表,则这也有效,LLVM_INCLUDE_DIRS因为此列表中的项目将显式分隔,;以便不需要不带引号的空格作为隐式列表项分隔符。

旁注: 当在我的 CMake 文件中使用硬编码路径名(无论出于何种原因)时,我通常使用正斜杠作为目录分隔符,因为这也适用于 Windows,并且避免需要转义所有反斜杠。

  • 您仍然需要在第二个选项中转义反斜杠。 (2认同)

Fra*_*ser 4

这更有可能是 处LLVM_INCLUDE_DIRS设置时的错误,而不是 处的问题include_directories

要检查这一点,请尝试致电include_directories("C:\\Program Files\\LLVM\\include")- 它应该可以正常工作。

问题似乎是LLVM_INCLUDE_DIRS在没有使用引号的情况下构建的。尝试运行以下命令:

set(LLVM_INCLUDE_DIRS C:\\Program Files\\LLVM\\include)
message("${LLVM_INCLUDE_DIRS}")
set(LLVM_INCLUDE_DIRS "C:\\Program Files\\LLVM\\include")
message("${LLVM_INCLUDE_DIRS}")
Run Code Online (Sandbox Code Playgroud)

输出是:

C:\Program;Files\LLVM\include
C:\Program Files\LLVM\include
Run Code Online (Sandbox Code Playgroud)

请注意第一输出行中的分号。这是一个包含 2 项的列表。

LLVM_INCLUDE_DIRS所以解决这个问题的方法就是修改创建方式。