nm:"U"符号未定义

bba*_*zso 49 c++ linker development-environment

当我在我的一个lib上nm:

nm libmylib.so

我得到这样一条线

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
Run Code Online (Sandbox Code Playgroud)

我查看了nm的手册页,我得到了"U"符号未定义.未定义的符号究竟意味着什么?

如果它确实是未定义的,那么为什么nm会报告它呢?

Tro*_*our 43

未定义的符号是库使用的符号,但未在创建库的任何目标文件中定义.

通常,符号在另一个库中定义,该库也需要链接到您的应用程序.或者,符号未定义,因为您忘记构建定义符号的代码,或者您忘记将带有该符号的目标文件包含到库中.

在您的情况下,它看起来像您的实现的C库中的符号,因此您可能希望在您自己的库中未定义.它将在你的libc.so中定义,无论在哪里,可能是/ usr/lib.


Foo*_*ooo 8

破译可以这样完成:

           U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
Run Code Online (Sandbox Code Playgroud)

方法:

    U->>> in your library its undefined
Run Code Online (Sandbox Code Playgroud)

什么是未定义?

     _ZNSs4_Rep20_S_empty_rep_storageE
Run Code Online (Sandbox Code Playgroud)

哪里可能找到它?

      GLIBCXX_3.4
Run Code Online (Sandbox Code Playgroud)

现在回答你的问题:“为什么它是未定义的:”,这是因为链接器无法找到它的定义

第二部分:“如果它未定义,为什么要报告”,nm 实用程序将读取您的 lib 的整个符号表并打印它。因此,它只是读取和打印它,而不对其进行任何操作。