11

我正在尝试针对 wxWidgets 构建程序,但出现链接器错误。我想真正理解它的含义。错误是:

/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'

我不明白为什么错误出现在libwx_baseu-2.8.so. 我认为.so文件的所有符号都已解析,这与.o仍需要链接的文件相反。

当我ldd.so我可以解析其所有链接库,所以那里没有问题:

$ ldd /usr/lib/libwx_baseu-2.8.so
 linux-gate.so.1 =>  (0x00476000)
 libz.so.1 => /lib/libz.so.1 (0x00d9c000)
 libdl.so.2 => /lib/libdl.so.2 (0x002a8000)
 libm.so.6 => /lib/libm.so.6 (0x00759000)
 libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x002ad000)
 libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0068d000)
 libpthread.so.0 => /lib/libpthread.so.0 (0x006f0000)
 libc.so.6 => /lib/libc.so.6 (0x00477000)
 /lib/ld-linux.so.2 (0x007f6000)

这是否意味着该.so文件未正确编译(在这种情况下,这是我的分发包中的一个错误)还是意味着我的特定程序的链接器命令行上缺少库?

此外,您知道如何获取 ELF 文件中未定义符号的列表吗?我试过readelf -s了,但我找不到丢失的符号。

谢谢你。

米尔德里德

4

4 回答 4

10

I thought that .so files had all its symbols resolved, contrary to .o files that still need linking.

共享库可能不完整,这没关系。

do you know how I can get a list on undefined symbols in an ELF file

利用

nm -C -u libwx_baseu-2.8.so

于 2010-04-15T08:48:03.143 回答
4

我认为您在链接程序时没有链接到某些库。

您应该在您的程序中链接到您在 .so 中链接到的所有共享库

如果 .so 链接到一些静态库 - 如果在 .so 中找到所有需要的符号,则程序不需要链接到它们

您可以使用nmlinux 命令查看目标文件、库或二进制文件中的符号

编辑
您的特定问题可以在这里描述:http: //old.nabble.com/-Bug-49433--gcc4.4,-NEW :-gcc4.4-misses-std::endl-implementation-at--O2 %2B-td22836171.html

于 2010-04-15T08:40:13.457 回答
4

当您将共享库链接到其他共享库(例如链接libwx_baseu-2.8.so到)时,链接器会记录由 使用和提供的libstdc++.so版本化符号。libwx_baseulibstdc++

如果在运行时您使用不同的副本libstdc++(一个不提供相同版本符号的副本),您会收到(动态)喜欢错误并且程序根本无法运行(这比“神秘“稍后崩溃)。

但是这里发生的情况是您尝试链接可执行文件,这意味着(静态)链接器想要找到运行时需要的所有符号。同样,您将可执行文件链接到不同的 (older) libstdc++.so,因此链接失败。

有两个常见的根本原因:
- 您链接libwx_baseu-2.8.so到不同的系统(一个具有较新版本的 GCC),并将其复制到当前系统,或者
- 您已链接libwx_baseu-2.8.so到同一系统上的较新 GCC,但现在试图将可执行文件与较旧的 GCC 链接。

于 2010-04-17T04:37:08.753 回答
1

尝试:将 -fno-inline 放入 Makefile 的标志中。基本上 g++4.4 没有它会出现问题。尝试放置或删除 -O 选项。它解决了我遇到的同样问题。

于 2012-03-22T09:37:35.470 回答