c++ - nm符号“U”和“T”,这是什么意思?
问题描述
我在运行时遇到未定义的符号错误,当我在相关库中查找符号时,我得到了结果:
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
在第一个中,有问题的符号被声明为 member static const std::string& empty_scalar();
。在第二个中,它被声明为 member static std::string empty_scalar;
。
您看到的两个符号名称与这两个不同的声明相匹配。empty_scalar
如果编译器看到这样的声明不一致,则编译器不应允许这样做。
我认为您链接了使用声明符号的不同版本的头文件编译的目标文件。然后链接器会认为这两个符号不同,因为它们的名称不同。您使用的目标文件确实包含旧 api 变体的定义,但一些代码正在使用新的。
推荐阅读
- python - 解决了返回 QuerySet 而不是 ObjectType 的反向引用
- python - 测试时间序列数据中未标记的分钟数
- angular - 将 Ruby On Rails 资产路径与 Webpacker 一起用于 Angular 模板
- cloud-foundry - 如何为在云Foundry的内部域(apps.internal)中运行的应用程序创建用户提供的服务
- javascript - 如何控制可变数量的输入 - React
- javascript - 无法从外部 html 文件获取元素到内容脚本
- gcloud - 从 json 文件创建 gcloud 配置
- c++ - 当我在 C++ 中的类中使用类时收到警告
- python - Python:为每个对象添加一个以唯一方式依赖于其他属性的数据类对象属性
- c# - ImageMagik 图片未正确渲染,图像上到处都是白色方块