Ошибка поиска символа: символ существует, я знаю, где он находится, как мне получить 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)

как бы ты это сделал.

Другие вопросы по тегам