使用CMake';s include_directories命令,带空格
我正在使用CMake构建我的项目,我有以下几行代码:使用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.
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中。我把路径用引号括起来,结果成功了:-)