Наследование в cmake от c ++ - PullRequest
       36

Наследование в cmake от c ++

0 голосов
/ 07 февраля 2019

У меня есть интерфейс в C ++, который является родителем класса.Я хочу создать проект с помощью cmake с двумя различными списками CMakel, один для интерфейса, а другой для класса в подкаталоге.Затем мне нужно создать статическую библиотеку из класса.Это означает создание файла .a и установку целей с необходимыми заголовочными файлами, которые требуются .a.У меня проблемы, потому что я могу установить .h только из класса.Заголовки интерфейса, включенные в заголовки классов, не установлены и не найдены.Как правильно включить интерфейс в класс, правильно установить и экспортировать цели?

Это структура:

|-------> interface
|           |----> CMakeLists.txt
|           |----> include
|                   |----> interface.hpp
|           |----> class
|                   |----> CMakeLists.txt
|                   |----> include
|                            |----> class.hpp
|                   |----> src
|                            |----> class.cpp

Код здесь.

Интерфейс

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/class ${CMAKE_CURRENT_BINARY_DIR}/class)
add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} INTERFACE
                        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                        $<INSTALL_INTERFACE:include>)
install(TARGETS ${PROJECT_NAME} EXPORT ${PRODUCT_TARGET})

Класс

add_library(${PROJECT_NAME} src/class.cpp include/class.hpp)
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "include/class.hpp")
target_include_directories(${PROJECT_NAME}
                       PUBLIC  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                               $<INSTALL_INTERFACE:include>
                       PRIVATE  $<TARGET_PROPERTY:interface,INTERFACE_INCLUDE_DIRECTORIES>)
install(TARGETS ${PROJECT_NAME} EXPORT ${PRODUCT_TARGET}
                ARCHIVE DESTINATION lib
                LIBRARY DESTINATION lib
                RUNTIME DESTINATION bin
                PUBLIC_HEADER DESTINATION include/${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} INTERFACE interface)

РЕДАКТ. 1 *** Генерация .a в порядке, но когда я используюэто в другом проекте, и я включаю class.h он не находит заголовки интерфейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...