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

C++ 链接:为什么我在.so文件中得到未定义的引用,c++,linker,shared-libraries,symbols,elf,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' 这是否意味着.so文件未正确编译(在这种情况下,这是我的分发包中的一个错误),还是意味着我的特定程序的链接器命令行上缺少库 另外,您知道如何在ELF文件中获取未定义

我试图针对wxWidgets构建一个程序,但我得到了一个链接器错误。我想真正理解这意味着什么。错误是:

/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'
这是否意味着
.so
文件未正确编译(在这种情况下,这是我的分发包中的一个错误),还是意味着我的特定程序的链接器命令行上缺少库

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

多谢各位


米尔德里德

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

你应该在你的程序中链接到你在程序中链接到的所有共享库

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

您可以使用
nm
linux命令查看对象文件、库或二进制文件中的符号

编辑

您的特定问题可以在这里描述:

我认为.so文件的所有符号都已解决,而.o文件仍然需要链接。

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

您知道如何在ELF文件中获取未定义符号的列表吗

使用


nm-C-u libwx_baseu-2.8.so

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

如果在运行时使用不同的
libstdc++
(不提供相同版本符号的副本),则会出现(动态)类似错误,并且程序根本不会运行(这比以后出现“神秘”崩溃更好)

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

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

尝试:将-fno内联
在Makefile中的标记中。基本上,g++4.4在没有它的情况下会出现问题。尝试放置或删除-O选项。它解决了我遇到的同一个问题。

如果你在链接时遇到问题,如果你发布了准确的链接器命令行,可能会有所帮助。谢谢你,就是这样,但显然没有缺少符号:$nm:/usr/lib/libwx_baseu-2.8。所以:没有符号nm:/usr/lib/libwx_baseu-2.8。所以:没有符号
$ 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)