CMAKE - Как правильно скопировать статический файл заголовка библиотеки в/usr/include?
Я использую CMAKE с C, и на самом деле я создаю две очень маленькие статические библиотеки.
Моя цель:
- Библиотеки скомпилированы и связаны в файлы *.a. [ЭТО РАБОТАЕТ]
- Затем я хочу скопировать эти *.a файлы в /usr/local/lib [ЭТО ТАКЖЕ РАБОТАЕТ]
- Насколько я знаю о библиотеках (очень мало), они связаны с помощью
-lnameoflib
, который является флагом компилятора. ХОРОШО. Я подготовил свой CMakeLists.txt, и он фактически копирует файлы *.a в /usr/local/lib
. Однако, чтобы иметь возможность использовать их в программе, мне также нужно скопировать их заголовочные файлы в /usr/local/include
, затем я могу включить их простым способом #include <mylibheader.h>
. Вот как я понимаю это сейчас.
И мой вопрос - как правильно копировать заголовочные файлы в папку /usr/include с помощью CMAKE? Я бы хотел, чтобы они автоматически копировались при выполнении make install
, как файлы *.a.
Для обеих библиотек у меня есть знакомый CMakeLists.txt:
project(programming-network)
add_library(programming-network STATIC
send_string.c
recv_line.c
)
INSTALL(TARGETS programming-network
DESTINATION "lib"
)
Ответы
Ответ 1
Лучший способ для новой версии cmake - использовать целевые свойства PUBLIC_HEADER
.
project(myproject)
add_library(mylib some.c another.c)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "some.h;another.h")
INSTALL(TARGETS mylib
LIBRARY DESTINATION some/libpath
PUBLIC_HEADER DESTINATION some/includepath
)
Некоторые ссылки:
PUBLIC_HEADER
CMake установить команду
Ответ 2
В гораздо лучшем виде скопируйте все файлы, соответствующие шаблону, и сохраните структуру каталогов.
INSTALL (
DIRECTORY ${CMAKE_SOURCE_DIR}/include/
DESTINATION include
FILES_MATCHING PATTERN "*.h*")
Ответ 3
Я не думаю, что ваше решение является правильным. /usr/include
должен быть зарезервирован для вашего поставщика для размещения файлов.
Правильная вещь для IMO - установить заголовок в /usr/local/include
, а затем проинструктировать пользователя export CPATH="/usr/local/include:${CPATH}"
.
Кажется, что /usr/local/lib
был автоматически, но если вы хотите использовать другой dir export LIBRARY_PATH="/usr/local/lib:${LIBRARY_PATH}"
, работает аналогично для .a бинарного (но может или не может работать хорошо для разделяемых библиотек в зависимости от ваших os).
Необязательно, но более громоздким является добавление -I /usr/local/include
и -L /usr/local/lib
при компиляции.
Это несколько субъективный ответ, но он хорошо работает для меня.