nm:“U”符号未定义

当我在我的一个库中nm:

nm libmylib.so

我得到这样的一条线

U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4 

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

如果它真的没有定义,那nm为什么要报告呢?

未定义的符号是库使用的符号,但没有在创build库的任何对象文件中定义。

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

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

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

解密这个可以这样做:

  U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4 

手段:

  U->>> in your library its undefined 

什么是未定义的?

  _ZNSs4_Rep20_S_empty_rep_storageE 

哪里可能find它?

  GLIBCXX_3.4 

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