【问题标题】:Unable to load shared library: undefined symbols无法加载共享库:未定义的符号
【发布时间】:2012-11-20 18:25:14
【问题描述】:

我在 linux (ubuntu) 系统上有自己的插件程序(动态共享库)。我的库(插件)使用 OpenCV(可能不那么重要)。

我的插件在 /usr/local/lib/mysoft/。

我已经成功编译了我的程序,即使使用库,也已成功安装,所以到目前为止一切似乎都很好。

当我运行我的程序时,它会根据一些配置文件加载这些库。我有几个已成功加载的库,但我无法加载一个库。加载时出现错误(使用 dlopen() 打开库):

/usr/local/lib/mysoft/libMyPlugin2.so: undefined symbol: _ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi
Segmentation fault (core dumped)
Tue Nov 20 19:11:29 CET 2012

显然,要找到作为 OpenCV 一部分的 cv::resize 存在一些问题,但我不明白为什么。

我检查了以下内容:

  • OpenCV 可能已正确安装,因为其他库也使用它并且加载时没有问题
  • 我的程序 libMyPlugin2.so 或 OpenCV 没有任何依赖项丢失(使用 ldd 检查)
  • 所有库和二进制文件的架构似乎都相同(我用 objdump -f 检查过)

有人知道我做错了什么吗?

这篇文章似乎很相关,但仍然没有帮助: Linux shared library that uses a shared library undefined symbol

【问题讨论】:

  • 您可能安装了多个版本的 OpenCV,并且在运行时选择了错误的版本。
  • 可能 Andrey Kamaev 是正确的,但尝试在调试模式下构建 OpenCV 并使用调试库运行它。 Ubuntu / Linux 发行版上的 OpenCV 有一些先决条件,您只能在调试模式下获得这些先决条件。
  • 我安装了多个版本的 OpenCV 是正确的,但我链接了正确的版本(使用 ldd 检查)。即使在卸载之后,现在当我只有一个版本时,它的行为也是一样的(我什至重建了我的软件以确保它与单个版本链接)。
  • _ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi 显然看起来像一个 C++ 错位名称,因此您似乎遇到了 C++ ABI 兼容性问题。您使用什么编译器以及用于构建库的编译器是什么?也许,在另一个编译器版本中,重整算法略有改变,所以大部分符号都是正确的。
  • 实际上我使用 CMake 来生成 Makefiles 但你是对的 - 似乎不同的编译器版本存在问题。您知道是否可以基于二进制文件分析问题?我为 OpenCV 和我的东西的 CMake 指定了相同的编译器,但它没有解决我的问题(我使用了 CMAKE_CXX_COMPILER=/usr/bin/g++ 和 CMAKE_CC_COMPILER=/usr/bin/gcc)。

标签: c linux opencv dynamic-linking undefined-symbol


【解决方案1】:

嗯,我找到了问题,希望它可以帮助其他人......

问题 - 我在编译时缺少一个 OpenCV 库。所以我用“opencv_core opencv_imgproc opencv_highgui”替换了“opencv_core opencv_highgui”,一切正常。

因此,尽管我能够编译它,但缺少一个依赖项 - 我猜 OpenCV 中发生了一些变化,因为这些源代码与旧版本的 OpenCV 完美配合(即使是构建)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2011-09-16
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多