我正在macos中编译HPX (一个高性能计算库),它使用的是Boost。我使用clang 10和meson作为构建系统。使用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字符。为什么会发生这种情况,我能做些什么?这超出了我的知识范围,任何帮助都将深表感谢。谢谢。
发布于 2020-12-10 05:52:58
根据优秀的https://demangler.com/,这些定义中的第一个是:
_boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&,boost::filesystem::
路径常量&,无符号整数,boost::system::error_code*)
第二个是:
_boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&,boost::filesystem::path const&,
boost::system::error_code*)
现在您可以看到,第一个版本中的区别是一个额外的unsigned int参数。我不知道为什么会这样,但这可能会给你一些关于发生了什么的线索。
发布于 2020-12-10 08:02:23
谢谢你们。我能够看到,在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库。
https://stackoverflow.com/questions/65225280
复制相似问题