Использование команды CMake include_directories с пробелами - PullRequest
3 голосов
/ 01 апреля 2012

Я использую 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 ]

3 голосов
/ 02 апреля 2012

В CMake

  • пробел является разделителем списка (например, ;),
  • при оценке имен переменных в основном заменяет имя переменной ее содержимым, а
  • \ является escape-символом (чтобы получить символ, его также необходимо экранировать)

Итак, в вашем примере 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, аи избегает необходимости избегать всех обратных наклонных черт.

3 голосов
/ 01 апреля 2012

Скорее всего, это ошибка в точке, где установлено 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.

...