加载库失败,但符号可从引用的库中获得
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
以查看动态链接器如何搜索。
【讨论】:
以上是关于加载库失败,但符号可从引用的库中获得的主要内容,如果未能解决你的问题,请参考以下文章