ELF:链接:为什么我在.so文件中获得未定义的引用

时间:2010-04-15 08:26:51

标签: c++ linker shared-libraries symbols elf

我正在尝试构建针对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 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

如果在运行时使用libstdc++的不同副本(一个不提供相同版本符号的副本),则会出现(动态)喜欢错误并且程序根本不运行(这比后来的“神秘”崩溃更可取。)

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

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

答案 2 :(得分:3)

我认为在链接您的程序时,您不会链接到某些库。

您应该将您的程序链接到您在.so

中链接到的所有共享库

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

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

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

答案 3 :(得分:1)

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