加载库失败,但符号可从引用的库中获得

Posted

技术标签:

【中文标题】加载库失败,但符号可从引用的库中获得【英文标题】:Load library failed, but symbol is available from referenced library 【发布时间】:2011-02-21 16:01:28 【问题描述】:

我正在尝试为我们拥有的供应商的 C++ 库编写 Python 绑定。我在继续,但很痛苦(部分原因是我们没有库的源代码)。

现在,gcc (4.4.4) 抱怨找不到一些异常类:

Load library for "FOO_Sessions" failed, the system error message is "/home/djc/foo/lib/libFOO_Sessions.so: undefined symbol: _ZTIN3foo4some22SomeExceptionE"

但是,我在 libFOO_Elsewhere 中找到了 _ZTIN3foo4some22SomeExceptionE(使用 objdump -x),它可以在同一个 /home/djc/foo/lib/ 目录中找到,并且已经使用编译器调用上的 -l 开关进行了引用。

LD_DEBUG=all 报告以下内容(感谢 Erik 的建议):

/home/djc/foo/lib/libFOO_Sessions.so: error: symbol lookup error: undefined symbol: _ZTIN3foo4some22SomeExceptionE (fatal)

但是,objdump -p 会为 libFOO_Sessions.so 报告此情况:

Dynamic Section:
  NEEDED               libFOO_Connections.so
  NEEDED               libFOO_Session_Base.so
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  SONAME               libFOO_Sessions.so

libFOO_Elsewhere(包含 _ZTIN3foo4some22SomeExceptionE)是否也应该在 libFOO_Sessions 的 NEEDED 条目中?

【问题讨论】:

【参考方案1】:

在运行前将 LD_LIBRARY_PATH 设置为 /home/djc/foo/lib/,或者在 libFOO_Sessions.so 之前显式加载依赖库。 man ld-linux 解释了动态链接器将如何搜索。

编辑:

另外,在运行前设置LD_DEBUG=all 以查看动态链接器如何搜索。

【讨论】:

以上是关于加载库失败,但符号可从引用的库中获得的主要内容,如果未能解决你的问题,请参考以下文章

强制 GCC 通知共享库中未定义的引用

链接器如何在剥离的动态库中定位代码?

加载时动态链接和运行时动态链接之间的区别

iOS项目中引用第三方库引发冲突的解决方法

共享库如何获得自己的基地址

Roslyn 如何获得一个类的引用