Подтвердить что ты не робот

CMAKE - Как правильно скопировать статический файл заголовка библиотеки в/usr/include?

Я использую CMAKE с C, и на самом деле я создаю две очень маленькие статические библиотеки.

Моя цель:

  1. Библиотеки скомпилированы и связаны в файлы *.a. [ЭТО РАБОТАЕТ]
  2. Затем я хочу скопировать эти *.a файлы в /usr/local/lib [ЭТО ТАКЖЕ РАБОТАЕТ]
  3. Насколько я знаю о библиотеках (очень мало), они связаны с помощью -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"
        )
4b9b3361

Ответ 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 при компиляции.

Это несколько субъективный ответ, но он хорошо работает для меня.