Как установить 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
, чтобы посмотреть, помогло ли это, но не повезло.
Ответы
Ответ 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()
.