【问题标题】:Different C++ mangled names in Boost library and in applicationBoost 库和应用程序中的不同 C++ 重命名名称
【发布时间】:2020-12-09 21:37:27
【问题描述】:

我在 macos 中编译 HPX(一个高性能计算库),它使用 Boost。我正在使用带有介子的 clang 10 作为构建系统。使用 nm 转储库和应用程序二进制文件来检查符号,我发现它们之间存在一个字母的差异。我正在构建的应用程序,作为我学习路径的开始,是官方文档中的 HPX hello world 示例。

libboost_filesystem-mt.dylib 中,符号是 __ZN5boost10filesystem6detail28directory_iterator_constructERNS0_18directory_iteratorERKNS0_4pathEjPNS_6system10error_codeE

在应用程序中它是 __ZN5boost10filesystem6detail28directory_iterator_constructERNS0_18directory_iteratorERKNS0_4pathEPNS_6system10error_codeE

唯一的区别是在libboost_filesystem-mt.dylib 中的损坏名称的path 部分之后添加了一个j 字符。为什么会发生这种情况,我该怎么办?这超出了我的知识范围,任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: c++ clang boost-filesystem hpx


    【解决方案1】:

    根据优秀的https://demangler.com/,其中第一个被拆解为:

    _boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&, boost::filesystem::path const&, unsigned int, boost::system::error_code*)

    第二个:

    _boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&, boost::filesystem::path const&, boost::system::error_code*)

    您现在可以看到,不同之处在于第一个版本中多了一个unsigned int 参数。 为什么我不知道应该是什么,但也许这会给你一些关于发生了什么的线索。

    【讨论】:

    • 我怀疑差异是由两个不同版本的 Boost 引起的。 Boost 1.72 添加了unsigned int 参数。
    【解决方案2】:

    谢谢你们。在c++filt 的帮助下,我能够看到这些符号确实引用了directory_iterator 的两个不同的构造函数。然后,我检查了 HPX 源代码,发现一个源文件中只有两个地方实例化了迭代器。我更改了将boost::system::error_code 变量添加到构造函数的代码,现在它可以正常工作了。由于新的unsigned int 参数是中间参数,因此将错误代码变量添加到构造函数可以消除歧义。现在是这样使用的:

    boost::system::error_code dir_ec;
    for (fs::directory_iterator dir(libs_path, dir_ec); dir != notier; ++dir) {...}
    

    我将在 GitHub 的项目中打开一个拉取请求。这是一个非常好的 HPC 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多