簡體   English   中英

Boost 庫和應用程序中的不同 C++ 名稱不同

[英]Different C++ mangled names in Boost library and in application

我在 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字符。 為什么會發生這種情況,我該怎么辦? 這超出了我的知識范圍,任何幫助將不勝感激。 謝謝。

根據優秀的https://demangler.com/ ,其中第一個 demangler 為:

_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參數。 為什么會這樣我不知道,但也許這會給你一些關於正在發生的事情的線索。

感謝你們。 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 庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM