Cmake: связывание разделяемой библиотеки - PullRequest
2 голосов
/ 16 января 2012

Я делал это раньше пару раз, но почему-то я застрял на этот раз. У меня есть исполняемый файл "myapp" и собственная общая библиотека "mylib". В моих cmakelists у меня есть следующее:

ADD_LIBRARY(mylib SHARED ${SOURCES_LIB})
INSTALL(TARGETS mylib DESTINATION .)
ADD_EXECUTABLE(myapp ${SOURCES_APP})
TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES} mylib)
INSTALL(TARGETS myapp DESTINATION .)

Все правильно компилируется и связывается, но когда я запускаю myapp, я получаю следующую ошибку:

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

Библиотека и исполняемый файл находятся в каталоге установки. Когда я делаю свою библиотеку статичной, изменяя первую строку перечисленных выше cmakelists на:

ADD_LIBRARY(mylib STATIC ${SOURCES_LIB})

тогда все работает на 100%.

Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Во время установки вашей библиотеки и исполняемого файла пути выполнения для поиска библиотеки удаляются из исполняемого файла. Поэтому ваша библиотека должна находиться в пути поиска библиотеки времени выполнения. Например, в Linux попробуйте установить LD_LIBRARY_PATH в каталог, содержащий установленную библиотеку, при запуске вашего исполняемого файла.

1 голос
/ 31 июля 2017

Это очень распространенный вопрос о "make install".На самом деле, есть 3 способа связать библиотеку с вашим исполняемым файлом.Фрист, вы можете использовать -l -L флаги в простых случаях.Как сказал Бенджамин, вы можете использовать LD_LIRARY_PATH и написать что-то вроде: export LD_LIBRARY_PATH=/usr/local/my_lib.На самом деле это не очень хороший способ.Гораздо лучше использовать RPATH.Существует очень полезная страница документации о это .Проверьте это.Хорошо, если вы напишите что-то вроде этого в вашем верхнем уровне CMakeLists.txt, это решит проблему:

SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
...