Я пишу подключаемый модуль для более крупной программы, написанной на C++. Я никогда раньше не писал библиотеку SO. Мой модуль компилируется и линкуется правильно (я думаю), однако основная программа, загружающая SO, вылетает с ошибкой symbol lookup error
.
Модуль, который я пишу, работал нормально, пока я не начал пробовать использовать в нем другие библиотеки. (конкретно кафе)
- Есть основная программа, которая разрабатывается другой группой
- Я пишу модуль плагина для этой программы
- Мой подключаемый модуль использует функции/код из Caffe (из файла libcaffe.so, сам Caffe представляет собой скомпилированный двоичный файл, чтобы добавить путаницы)
- Основная программа вылетает со следующей ошибкой
/path-to-binary/binary-name: symbol lookup error: ./build/libTestModule.so: undefined symbol: _ZN5caffe2db5GetDBERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Я попытался добавить export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
к своему .bashrc
.
Я сделал это, потому что (после некоторого поиска в Интернете - я на самом деле не понимаю, что я здесь делаю) я побежал
nm -g libcaffe.so | grep _ZN5caffe2db5GetDBERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
в папке /usr/lib
и этот символ существует в libcaffe.so
.
00000000001cbb30 T _ZN5caffe2db5GetDBERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
libcaffe.so
находится в/usr/lib
и содержит символ, который моя программа не может найти.- Насколько я понимаю, (по какой-то неизвестной мне причине) я должен установить
LD_LIBRARY_PATH
в/usr/lib
, чтобы моя программа могла найтиlibcaffe.co
и содержащиеся в нем символы. - Однако я бы предположил, что, поскольку
/usr/lib
содержит множество файлов.so
по умолчанию, это будет искаться независимо от того, был ли установленLD_LIBRARY_PATH
, т.е. не следует ли искать этот каталог по умолчанию? - Независимо от вышеуказанного вопроса, я не знаю, что мне следует попробовать дальше.
- Как я могу заставить свою программу найти указанный выше символ в
libcaffe.so
?
CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(TestModule)
find_package(Falaise REQUIRED)
add_library(TestModule SHARED TestModule.h TestModule.cpp)
set(Caffe_INCLUDE_DIRS "/usr/include/caffe")
set(Caffe_LIBRARIES "/usr/lib/libcaffe.so")
target_link_libraries(TestModule PUBLIC Falaise::FalaiseModule)