Символ НМ и «U» и «T», что это значит? - PullRequest
0 голосов
/ 17 ноября 2018

У меня возникает неопределенная ошибка символа во время выполнения, и когда я ищу символ в соответствующей библиотеке, я получаю результат:

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

Имеет ли это смысл?

1 Ответ

0 голосов
/ 17 ноября 2018

Существует два варианта 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, объявленный непоследовательно, как это.

Я думаю, вы связали объектные файлы, которые были скомпилированы с различными версиями заголовочного файла, который объявил символ.Затем компоновщик будет считать эти два символа разными из-за их разных имен.В объектном файле, который вы использовали, действительно содержалось определение для варианта old-api, но какой-то код использует новый.

...