符号查找错误:符号存在,我知道它在哪里,我如何让我的SO“看到它”?

时间:2018-02-02 11:33:03

标签: linker shared-libraries ld symbols

我正在为一个用C ++编写的更大程序编写一个插件模块。我之前从未写过SO库。我的模块正确编译和链接(我认为)然而加载SO的主程序崩溃时出现错误symbol lookup error

我写的模块运行正常,直到我开始尝试使用其中的其他库。 (特别是caffe)

  • 有一个由另一个小组开发的主程序
  • 我正在为这个程序编写一个插件模块
  • 我的插件模块使用来自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 个答案:

答案 0 :(得分:0)

您说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)

是你怎么做的。