cmake и GenerateExportHeader

Я пытаюсь использовать модуль GenerateExportHeader из cmake.

часть моих CmakeLists.txt:

add_compiler_export_flags()
add_library(gui SHARED ${gui_CPP} ${gui_HPP})
generate_export_header(gui)

Он хорошо работает для самого проекта gui, но когда я пытаюсь включить gui .H файлы в другом проекте, #include " gui_export.h " нельзя найти. Это очевидно, как gui_export.h был создан в каталоге сборки gui, который не включает путь других проектов.

простым решением было бы добавить директорию сборки gui к другим проектам, но: 1. Я не считаю это кошерным решением. 2. Я даже не мог найти, Как узнать, что такое сборка dir цели

Как я могу решить эту проблему?

3 ответов


С современным (т. е. 2.8.11 или более поздним) CMake предпочтительным механизмом является:

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports)

затем, когда вы экспортируете () свою библиотеку (что вы должны сделать!) или иначе используйте его в контексте, где известны свойства целевого интерфейса(например, в том же общем проекте CMake, который, похоже, что вы делаете), target_link_libraries (Foo gui) также подберет необходимый каталог include.

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


Я решил эту проблему, используя EXPORT_FILE_NAME, поэтому теперь у меня есть:

generate_export_header(gui EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exports/gui_export.h)

и во всех проектах я добавляю ${CMAKE_BINARY_DIR} / exports / to includes


используйте export (), чтобы CMake мог найти дерево сборки. Вы можете взглянуть на openobex на gitorious, чтобы увидеть, как конфиг.файл cmake должен выглядеть так.

OTOH, вы не должны использовать этот сгенерированный заголовок экспорта в общедоступном заголовке или устанавливать его.