加载库失败,但引用库中可以使用符号

时间:2011-02-21 16:01:29

标签: c++ gcc undefined-symbol

我正在尝试为我们拥有的供应商编写C ++库的Python绑定。我正在前进,但这很痛苦(部分原因是我们没有图书馆的资源)。

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

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

但是,我在libFOO_Elsewhere(使用objdump -x)中找到了_ZTIN3foo4some22SomeExceptionE,它可以在/ home / djc / foo / lib / dir中找到,并且已经在编译器调用时使用-l开关引用。 / p>

LD_DEBUG =所有报告以下内容(感谢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 个答案:

答案 0 :(得分:1)

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

编辑:

此外,在运行之前设置LD_DEBUG=all以查看动态链接器的搜索方式。