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
使用CMake';s include_directories命令,带空格_Cmake_Llvm - Fatal编程技术网

使用CMake';s include_directories命令,带空格

使用CMake';s include_directories命令,带空格,cmake,llvm,Cmake,Llvm,我正在使用CMake构建我的项目,我有以下几行代码: include_directories(${LLVM_INCLUDE_DIRS}) 在评估LLVM\u INCLUDE\u DIRS后,其评估结果为: include_directories(C:\Program Files\LLVM\include) 问题是,这被认为是两个包含目录,“C:\Program”和“Files\LLVM\include” 你知道我该怎么解决这个问题吗?我试着用引号,但没用 编辑:原来问题出在文件llvm-3.

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

include_directories(${LLVM_INCLUDE_DIRS})
在评估
LLVM\u INCLUDE\u 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)

这很可能是设置了
LLVM\u INCLUDE\u DIRS
时的错误,而不是
INCLUDE\u目录的问题

要检查此问题,请尝试调用
include\u目录(“C:\\Program Files\\LLVM\\include”)
-它应该可以正常工作

问题似乎在于
LLVM\u INCLUDE\u 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\u INCLUDE\u DIRS
的创建方式

  • 空白是一个列表分隔符(如
  • 计算变量名基本上用变量名的内容和名称替换变量名
  • \
    是转义字符(要获取符号,还需要对其进行转义)
因此,在您的示例中,
include\u目录(C:\\Pogram Files\\LLVM\\include)

include_directories( C:\\Program;Files\\LLVM\\include)
即,包含两项的列表。为了避免这种情况

  • 也要避开空白:

    include\u目录(C:\\Program\Files\\LLVM\\include)

  • 用引号将路径括起来:

    include\u目录(“C:\\Program Files\\LLVM\\include”)

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

  • 更简单,更容易阅读和
  • 可与变量求值一起使用,如示例中所示(因为求值结果被引号包围,因此被视为单个项目)

    include_目录(${LLVM_include_DIRS}”)

如果
LLVM\u INCLUDE\u DIRS
是多个目录的列表,这也适用,因为该列表中的项目将被
显式分隔
这样就不需要使用无引号的空格作为隐式列表项分隔符

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

在第二个选项中,您仍然需要转义反斜杠。我使用的是CMake GUI。这就是你要的吗?有点。在第一次运行时,当您单击“生成”时,CMake询问您将使用哪个生成器。我想是Visual Studio?哦,是的,我用过Visual Studio。我对VisualStudio的问题仅仅是因为“程序文件”中的空格。刚才我对空格和CMake有一个非常类似的问题。不管怎样,我有点困惑:哪一个是公认的答案?你在作品底部给出的还是你实际接受的?我认为最好将解决方案作为答案发布,而不是作为问题的一部分。感谢您提供的解决方案。问题实际上在LLVM提供的文件LLVMConfig.cmake中。我把路径用引号括起来,结果成功了:-)