c++ - nm 符号 "U"和 "T",这是什么意思?

标签 c++ undefined-symbol nm

我在运行时遇到 undefined symbol 错误,当我在相关库中查找符号时,我得到了结果:

nm -C -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U YAML::detail::node_data::empty_scalar[abi:cxx11]
00000000002b5860 T YAML::detail::node_data::empty_scalar[abi:cxx11]()

但这怎么可能呢?符号既未定义,也在库中?什么?或者这些实际上是不同的符号?当混淆时,名称确实略有不同:
nm -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U _ZN4YAML6detail9node_data12empty_scalarB5cxx11E
00000000002b5860 T _ZN4YAML6detail9node_data12empty_scalarB5cxx11Ev

这有意义吗?

最佳答案

yaml-cpp 有两种变体:

https://github.com/jbeder/yaml-cpp

https://github.com/jbeder/yaml-cpp.new-api

在第一个中,有问题的符号被声明为成员 static const std::string& empty_scalar(); .
在第二个中,它被声明为成员 static std::string empty_scalar; .

您看到的两个符号名称与这两个不同的声明相匹配。如果编译器看到 empty_scalar,这是不允许的。像这样不一致地声明。

我认为您链接了使用声明符号的不同版本的头文件编译的目标文件。然后链接器会认为这两个符号不同,因为它们的名称不同。您使用的目标文件确实包含旧 api 变体的定义,但一些代码正在使用新的。

关于c++ - nm 符号 "U"和 "T",这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345773/

相关文章:

c++ - 编译时计算对数组中对元素的差异

c++ - 参数数量无效

c++ - 按偏移量查找成员

linux - show 的 nm 输出共享库的版本不正确

c++ - 错误 - _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

c++ - 为什么 std::map 并不总是允许兼容类型作为其键类型?

c - 无法加载共享库 : undefined symbols

c - Diab 编译器中的解析错误

c - 无法编译 Hello World

c - 在 nm 报告中验证符号更改的简便方法