Подтвердить что ты не робот

Как установить include_directories из файла CMakeLists.txt?

Кажется, у меня возникают проблемы при настройке пути включения (-I) с помощью команды include_directories() в CMake. Каталог моего проекта выглядит следующим образом:

Root
| - CMakeLists.txt
| - libs
| - | - CMakeLists.txt
| - | - inc
| - | - | - // lib specific includes
| - | - src
| - | - | - // lib specific sources
| - proj1
| - | - CMakeLists.txt
| - | - inc
| - | - | - // proj1 specific includes
| - | - src
| - | - | - // proj1 specific sources

Корневой файл CMakeLists.txt выглядит так:

project(ROOT)
add_subdirectory(libs)
add_subdirectory(proj1)

Файл CMakeLists.txt в разделе libs:

project(lib)
add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) // for conciseness, omitted set() 

И, наконец, файл CMakeLists.txt в разделе proj1:

project(proj1)

include_directories("${ROOT_SOURCE_DIR}/lib/inc") # <- problem line?

add_executable(proj1 ${proj1_srcs})
target_link_libraries(proj1 lib)

Цель состоит в том, чтобы создать библиотеку из исходных и заголовочных файлов в libs, а затем создать ссылку на исполняемый файл, созданный в proj1. Proj1 имеет несколько файлов, которые включают в себя библиотеки #include, поэтому мне нужно добавить каталоги, которые будут использоваться с -I. Основываясь на документации, это то, что include_directories() должен делать. Однако, несмотря на явную установку этого и последующую отладку message(${INCLUDE_DIRECTORIES}), переменная INCLUDE_DIRECTORIES является пустой строкой, и каталоги для пути включения не указаны, поэтому моя компиляция proj1 не удалась.

Я также попытался удалить кавычки вокруг ${ROOT_SOURCE_DIR}/inc, чтобы посмотреть, помогло ли это, но не повезло.

4b9b3361

Ответ 1

include_directories() заполняет свойство каталога с именем INCLUDE_DIRECTORIES:

http://www.cmake.org/cmake/help/v2.8.12/cmake.html#prop_dir:INCLUDE_DIRECTORIES

Обратите внимание, что CMake 2.8.11 изучил команду target_include_directories, которая заполняет целевое свойство INCLUDE_DIRECTORIES.   http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

Также обратите внимание, что вы можете закодировать тот факт, что "для компиляции с заголовками цели lib необходим каталог include lib/inc" в саму цель lib, используя target_include_directories с ключевым словом PUBLIC.

add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) # Why do you list the headers?
target_include_directories(lib PUBLIC "${ROOT_SOURCE_DIR}/lib/inc")

Также обратите внимание, я предполагаю, что вы не устанавливаете библиотеку lib, чтобы другие могли ее использовать. В этом случае вам потребуется указать разные каталоги заголовков для расположения сборки и для установленного расположения.

target_include_directories(lib
  PUBLIC
    # Headers used from source/build location:
    "$<BUILD_INTERFACE:${ROOT_SOURCE_DIR}/lib/inc>"
    # Headers used from installed location:
    "$<INSTALL_INTERFACE:include>"     
)

В любом случае, это важно, только если вы устанавливаете lib для других пользователей.

После target_include_directories(lib ...) выше вам не нужен другой вызов include_directories(). Цель lib сообщает 'proj1' о включаемых каталогах, которые необходимо использовать.

Смотрите также target_compile_defintions() и target_compile_options().