#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