Я создаю общую библиотеку в одном проекте и использую ее в другом. У них общий префикс, но я не собираю их вместе (например, <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
.