【问题标题】:nm: "U" The symbol is undefinednm: "U" 符号未定义
【发布时间】:2011-01-20 17:53:10
【问题描述】:

当我在我的一个库上运行时:

nm libmylib.so

我得到这样的一条线

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

我检查了 nm 的手册页,我得到“U”符号未定义。未定义符号的真正含义是什么?

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

【问题讨论】:

  • 顺便说一句,nm --demangle 对于 c++ 非常有用,它使符号更友好
  • @CarlosRendon 为什么他们不将其设为默认值?

标签: c++ linker development-environment


【解决方案1】:

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

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

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

【讨论】:

  • 实际上看起来像 libstdc++ 中的一个符号,但是是的,您会期望它会为您提供。
  • @ephemient: 糟糕,我错过了最后的 XX :) 谢谢。
【解决方案2】:

可以这样解密:

           U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

意思:

    U->>> in your library its undefined

什么是未定义的?

     _ZNSs4_Rep20_S_empty_rep_storageE

它可能在哪里找到它?

      GLIBCXX_3.4

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

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

【讨论】:

    【解决方案3】:

    这意味着库引用了该符号(在这种情况下为std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage?)但它没有定义它;您链接它的程序的某些部分,或者其他一些库应该这样做。如果您确实打算在库中定义它,则意味着您没有将目标文件与该符号的定义与库的其余代码链接。

    【讨论】:

      【解决方案4】:

      我认为它的确切含义是:在这个对象中未定义。一些符号在运行时被评估;这很可能是其中之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 2017-11-14
        • 2020-02-06
        • 2011-03-19
        • 2012-05-14
        • 1970-01-01
        相关资源
        最近更新 更多