Как настроить CMakeLists.txt для установки публичных заголовков разделяемой библиотеки? - PullRequest
0 голосов
/ 20 января 2019

Я хочу использовать cmake для установки моей библиотеки "edv", но когда я выполняю:

cmake --build.--target install

Устанавливается, но создает только «bin / edv.dll» и «lib / ».Как я могу сделать cmake для установки EDV_PUBLIC_INCLUDE_DIRECTORIES внутри "include / ..."?

cmake_minimum_required(VERSION 3.12)

project(edv)

# include PUBLIC directories
set(EDV_PUBLIC_INCLUDE_DIRECTORIES      include/ )

set(EDV_PRIVATE_INCLUDE_DIRECTORIES     src/   )

# Edv source files list
file(GLOB_RECURSE EDV_SOURCE_FILES "src/*.cpp" "src/*.hpp*")


# build the library
add_library(${PROJECT_NAME} SHARED ${EDV_SOURCE_FILES} )

target_include_directories(${PROJECT_NAME} PUBLIC ${EDV_PUBLIC_INCLUDE_DIRECTORIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${EDV_PRIVATE_INCLUDE_DIRECTORIES})

install (TARGETS ${PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)

1 Ответ

0 голосов
/ 21 января 2019

CMake не может определить набор файлов заголовков, которые должны быть установлены из цели. Это имеет смысл, поскольку цель может содержать как частные, так и публичные заголовочные файлы, но CMake не делает различий между ними. Как следствие, вы должны явно указать заголовочные файлы в команде INSTALL(FILES ...):

install(FILES ${MY_HEADER_FILES} DESTINATION include)

Поле PUBLIC_HEADER, на которое вы наткнулись, связано с механизмом платформы OSX, который сам по себе является червем. Я советую вам избегать этого, если вы на самом деле не хотите развернуть свою библиотеку как .framework на OSX.

Обратите особое внимание на параметр INCLUDES DESTINATION для команды INSTALL(TARGET ...). Хотя это на самом деле не копирует сами файлы, оно позволяет автоматически добавлять каталог include к импортированной цели, предоставленной сценарием пакета конфигурации. Если вы намереваетесь предоставить своим пользователям скрипт конфигурации пакета (что, вероятно, следует, по крайней мере, если вы ожидаете, что ваши пользователи также будут использовать CMake), вы, вероятно, захотите установить эту опцию.

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

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