Ошибка поиска символа: символ существует, я знаю, где он находится, как мне получить SO, чтобы "увидеть его"?
Я пишу модуль плагина для более крупной программы, написанной на 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)
1 ответ
Ваш libTestModule.so
Вы говорите, зависит от libcaffe.so
но вы не связываете это. Это:
cmake_minimum_required(VERSION 3.3)
project(TestModule)
find_package(Falaise REQUIRED)
add_library(TestModule SHARED TestModule.h TestModule.cpp)
target_link_libraries(TestModule PUBLIC Falaise::FalaiseModule caffe)
как бы ты это сделал.