nm:“U”符号未定义

时间:2010-02-24 21:33:35

标签: c++ linker development-environment

当我在我的一个lib上nm时:

nm libmylib.so

我得到这样的一行

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

我检查了纳米的手册页,我得到了“U”符号未定义。未定义的符号究竟意味着什么?

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

4 个答案:

答案 0 :(得分:43)

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

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

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

答案 1 :(得分: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的整个符号表并打印出来。所以,它只是阅读&打印它而不对其进行任何操作。

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

我认为这意味着:在此对象中未定义。某些符号在运行时进行评估;这可能就是其中之一。