Using CMake's include_directories command with white spaces

血红的双手。 提交于 2019-12-23 16:30:11

问题


I am using CMake to build my project and I have the following line:

include_directories(${LLVM_INCLUDE_DIRS})

which, after evaluating LLVM_INCLUDE_DIRS, evaluates to:

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

The problem is that this is being considered two include directories, "C:\Program" and "Files\LLVM\include".

Any idea how can I solve this problem? I tried using quotation marks, but it didn't work.

EDIT: It turned out that the problem is in the file llvm-3.0\share\llvm\cmake\LLVMConfig.cmake. I enclosed the following paths with quotation marks and the problem was solved:

set(LLVM_INSTALL_PREFIX C:/Program Files/LLVM)
set(LLVM_INCLUDE_DIRS ${LLVM_INSTALL_PREFIX}/include)
set(LLVM_LIBRARY_DIRS ${LLVM_INSTALL_PREFIX}/lib)

回答1:


This is more likely to be an error at the point where LLVM_INCLUDE_DIRS is set rather than a problem with include_directories.

To check this, try calling include_directories("C:\\Program Files\\LLVM\\include") - it should work correctly.

The problem seems to be that LLVM_INCLUDE_DIRS was constructed without using quotation marks. Try for example running this:

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}")

The output is:

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

Note the semi-colon in the first output line. This is a list with 2 items.

So the way to fix this is to modify the way in which LLVM_INCLUDE_DIRS is created.




回答2:


In CMake,

  • whitespace is a list separator (like ;),
  • evaluating variable names basically replaces the variable name with its content and
  • \ is an escape character (to get the symbol, it needs to be escaped as well)

So, in your example, include_directories(C:\\Pogram Files\\LLVM\\include) is the same as

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

that is, a list with two items. To avoid this, either

  • escape the whitespace as well:

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

  • surround the path with quotation marks:

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

Obviously, the second option is the better choice as it is

  • simpler and easier to read and
  • can be used with variable evaluation like in your example (since the result of the evaluation is then surrounded by quotation marks and thus, treated a single item)

    include_directories("${LLVM_INCLUDE_DIRS}")

This works as well, if LLVM_INCLUDE_DIRS is a list of multiple directories because the items in this list will then be explicitly separated by ; so that there is no need for unquoted whitespace as implicit list item separator.

Side note: When using hard-coded path-names (for whatever reason) in my CMake files, I usually uses forward slashes as directory separators as this works on Windows as well and avoids the need to escape all backslashes.



来源:https://stackoverflow.com/questions/9964775/using-cmakes-include-directories-command-with-white-spaces

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!