Не удается найти файл заголовка API для общей библиотеки с помощью cmake - PullRequest
0 голосов
/ 27 апреля 2020

Я создаю общую библиотеку в одном проекте и использую ее в другом. У них общий префикс, но я не собираю их вместе (например, <prefix>/mylib и <prefix>/myproject). И mylib, и myproject имеют каталоги src и include.

CMakeList.txt для общей библиотеки:

cmake_minimum_required(VERSION 3.5)
project(mylib)

add_library(mylib SHARED
            src/mylib.c
            )

target_include_directories(mylib PRIVATE include)

set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)

install(TARGETS
  mylib
  LIBRARY DESTINATION lib
  PUBLIC_HEADER DESTINATION include
  RUNTIME DESTINATION bin)

В результате устанавливается mylib.so install/mylib/lib/mylib.so и mylib.h устанавливаются в install/mylib/include/mylib.h, что я и хотел.

Затем я хочу создать проект, использующий mylib:

#include "mylib.h"

int main(void)
{
    // use some functions in mylib
}

. связанный CMakeList.txt файл для main.c:

cmake_minimum_required(VERSION 3.5)
project(myproject)

find_package(mylib REQUIRED)

add_executable(myproject src/main.c)
target_link_libraries(myproject mylib)

install(TARGETS
  myproject
  DESTINATION lib/${PROJECT_NAME})

Это приводит к:

main.c: fatal error: mylib.h: No such file or directory
#include "mylib.h"
         ^~~~~~~~~

Если я изменю CMakeList.txt, включив следующее:

find_path(MYLIB_INCLUDE_DIR mylib.h)
...
target_include_directories(myproject PUBLIC ${MYLIB_INCLUDE_DIR})

Затем он находит заголовок, но не библиотеку. Я получаю ошибку компоновщика:

/usr/bin/ld: cannot find -lmylib

Если я изменю CMakeList.txt, включив в него следующее:

find_library(MYLIB_LIB mylib)
...
target_link_libraries(myproject ${MYLIB_LIB})

Затем он строит.

Я (думаю, я) Я понимаю, почему поиск библиотеки и включаемых файлов работает вручную, но это, кажется, неправильный способ go о вещах ...

find_package(mylib), кажется, находит пакет mylib (я могу напечатать Переменные cmake и mylib_FOUND=1), но не могут найти библиотеку и заголовок таким образом, чтобы они создавались с myproject.

1 Ответ

0 голосов
/ 28 апреля 2020

Вам необходимо указать включаемые каталоги для вариантов "build" и "install" в target_include_directories вашего библиотечного проекта:

target_include_directories(mylib PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # build variant
    $<INSTALL_INTERFACE:include> # install variant
)

Кстати, такой пример приведен в документации для target_include_directories команда.

...