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

时间:2012-04-01 13:31:51

标签: cmake llvm

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

include_directories(${LLVM_INCLUDE_DIRS})

,在评估LLVM_INCLUDE_DIRS后,评估为:

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

问题是这被认为是两个包含目录," 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)

2 个答案:

答案 0 :(得分:3)

在设置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}")

输出结果为:

C:\Program;Files\LLVM\include
C:\Program Files\LLVM\include

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

因此解决此问题的方法是修改LLVM_INCLUDE_DIRS的创建方式。

答案 1 :(得分:3)

在CMake中,

  • whitespace是一个列表分隔符(如;),
  • 评估变量名称基本上将变量名称替换为其内容和
  • \是一个转义字符(要获取符号,它也需要转义)

因此,在您的示例中,include_directories(C:\\Pogram Files\\LLVM\\include)

相同
include_directories( C:\\Program;Files\\LLVM\\include)

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

  • 也逃脱了空白:

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

  • 用引号括起路径:

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

显然,第二种选择是更好的选择,因为它是

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

    include_directories( “$ {LLVM_INCLUDE_DIRS}”)

这也适用,如果LLVM_INCLUDE_DIRS是多个目录的列表,因为此列表中的项目将由;显式分隔,这样就不需要将未引用的空格作为隐式列表项分离器。

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