#c #cmake #header-only
Вопрос:
Я пытаюсь реструктурировать свой проект CMAKE, поместив все заголовки в отдельный проект только для заголовков cmake и добавив его с помощью target_link_libraries в мой исходный проект cmake.
Можно ли сохранить путь к папке при включении заголовков в исходный файл cpp.
Заголовки в библиотеке интерфейса также должны иметь возможность доступа к другим заголовкам из другого каталога(в рамках одного и того же проекта интерфейса cmake), используя имя папки заголовка.
ожидаемый
#include "A/A.hpp"
#include "AGen/AGen.hpp"
#include "json/json.hpp"
текущая рабочая импл
#include "A.hpp"
#include "AGen.hpp"
#include "json.hpp"
конфигурация моего интерфейса cmake
set(project_includes_internal ${CMAKE_CURRENT_LIST_DIR}/A ${CMAKE_CURRENT_LIST_DIR}/B ${CMAKE_CURRENT_LIST_DIR}/C ) set(project_gen_includes ${CMAKE_CURRENT_BINARY_DIR}/include/AGen ${CMAKE_CURRENT_BINARY_DIR}/include/BGen ${CMAKE_CURRENT_BINARY_DIR}/include/CGen ) set(project_dep_inludes ${CMAKE_HOME_DIRECTORY}/dep/nlohmann/json ) set(PROJECT_INCLUDES ${project_includes_internal} ${project_gen_includes} ${project_dep_inludes}) add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} INTERFACE
lt;BUILD_INTERFACE:${PROJECT_INCLUDES}>
lt;INSTALL_INTERFACE:include>
)
мои источники конфигурации cmakeadd_executable(${PROJECT_NAME}-bin ${PROJECT_TARGET_SOURCES}) target_link_libraries(${PROJECT_NAME}-bin PUBLIC ${ACTIVATION_PROJECT_INCLUDES_NAME})
Также можно скопировать все необходимые включаемые файлы в каталог сборки, чтобы их можно было скопировать/опубликовать в tar при установке на другие машины.
Комментарии:
1. Я не понимаю, в чем здесь проблема. Если вы хотите это сделать
#include "AGen/AGen.hpp"
, добавьтеinclude
каталог вtarget_include_directories
вместоinclude/AGen
. Кроме того, «внутренний» предполагает, что эти заголовки должны быть видны только при реализации, так зачем добавлять их в интерфейс?2. @pptaszni не уверен, что именно вы подразумеваете под «внутренний предполагает, что эти заголовки должны быть видны только при реализации, так зачем добавлять их в интерфейс?» в основном я пытаюсь создать библиотеку только для заголовков и добавить ее в качестве цели вместо того, чтобы указывать заголовки в исходном файле cmake
3. Почему вы вызываете первую коллекцию заголовков
project_includes_internal
? Я подумал, потому что это внутренние детали, и я хотел бы посоветовать не включать их в интерфейс. В противном случае все, что вы показываете, правильно. Испытываете ли вы проблемы с включением заголовков в код? Ваш (немного упрощенный) пример работает для меня.