Cmake, связывающий разделяемую библиотеку из пути проекта

#cmake

#cmake

Вопрос:

Я пытаюсь настроить cmake для проекта c и связать свою библиотеку. По какой-то причине я не могу заставить cmake найти мою библиотеку в папке ./lib// . Согласно документации, путь поиска библиотеки должен быть /lib/ .

Я пробовал с пустым префиксом и с «./», и ни в том, ни в другом случае моя библиотека не найдена.

Если я даю ПОДСКАЗКУ в find_library(), то она найдена, но почему она не найдена без подсказки?

Это мой CMakeList.txt:

 cmake_minimum_required(VERSION 3.0.0)
project(UntitledProject VERSION 0.1.0)

include(CTest)
enable_testing()

message("ARCH: " ${CMAKE_LIBRARY_ARCHITECTURE})
message("PREFIX: " ${CMAKE_PREFIX_PATH})
message("LIB: " ${CMAKE_LIBRARY_PATH})

find_library(LIBMYLIB mylibrary)
message("MYLIB: " ${LIBMYLIB})

add_executable(UntitledProject main.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
 

Разделяемая библиотека действительно существует:

 $ file lib/x86_64-linux-gnu/libmylibrary.so
lib/x86_64-linux-gnu/libmylibrary.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=e34ba5ae24d6a09bfb847a46cd669ea7e101e8a4, stripped
 

Это результат настройки cmake:

 [cmake] The C compiler identification is GNU 7.5.0
[cmake] The CXX compiler identification is GNU 7.5.0
[cmake] Check for working C compiler: /usr/bin/x86_64-linux-gnu-gcc-7
[cmake] Check for working C compiler: /usr/bin/x86_64-linux-gnu-gcc-7 -- works
[cmake] Detecting C compiler ABI info
[cmake] Detecting C compiler ABI info - done
[cmake] Detecting C compile features
[cmake] Detecting C compile features - done
[cmake] Check for working CXX compiler: /usr/bin/x86_64-linux-gnu-g  -7
[cmake] Check for working CXX compiler: /usr/bin/x86_64-linux-gnu-g  -7 -- works
[cmake] Detecting CXX compiler ABI info
[cmake] Detecting CXX compiler ABI info - done
[cmake] Detecting CXX compile features
[cmake] Detecting CXX compile features - done
[cmake] ARCH: x86_64-linux-gnu
[cmake] PREFIX: 
[cmake] LIB: 
[cmake] MYLIB: LIBMYLIB-NOTFOUND
[cmake] Configuring done
[cmake] Generating done
 

Чего мне не хватает?

Ответ №1:

Возможно, вы могли бы попробовать установить CMAKE_PREFIX_PATH использование абсолютного пути из командной строки вместо ./

Комментарии:

1. Но тогда это не было бы переносимым?

2. Au contraire. Установка его в командной строке — это то, что делает его переносимым, поскольку в проекте нет необходимости что-либо жестко кодировать. Подумайте об этом, например: у вас есть 10 различных зависимостей, установленных в произвольных местах. Как еще вы могли бы указать эти местоположения библиотеки без жесткого кода в CMakeLists.txt ? Я не мог придумать другого способа. Итак, мы используем эту переменную, установив ее в командной строке следующим образом: cmake -D CMAKE_PREFIX_PATH="/path/to/lib/a;/path/to/lib/b;...;/path/to/lib/n" .....

Ответ №2:

Если я даю ПОДСКАЗКУ в find_library(), то она найдена, но почему она не найдена без подсказки?

Потому что по умолчанию find_library выполняется поиск в системном пути, который в Linux обычно /usr/lib является или /usr/local/lib .

Чтобы исправить, вы можете создать символическую ссылку с lib/x86_64-linux-gnu/ на /usr/local/lib :

 sudo ln -s lib/x86_64-linux-gnu/libmylibrary.so /usr/local/lib/libmylibrary.so