首頁 > 後端開發 > C++ > 主體

為什麼在 C 0x 模式下使用 libc 的 Clang 無法連結 Boost::program_options 範例?

DDD
發布: 2024-11-02 15:21:30
原創
678 人瀏覽過

Why does Clang with libc   in C  0x mode fail to link Boost::program_options examples?

為什麼不能在 c 0x 模式下用 libc clang 連結這個 boost::program_options 範例?

背景:

嘗試在C 0x 模式下使用Clang 和libc 編譯和連結Boost::program_options 範例時,出現以下錯誤:

Undefined symbols for architecture x86_64:
  // Various undefined symbols related to Boost::program_options
登入後複製

解釋:

此錯誤的主要原因是libc 與GCC 的libstdc 不二進位相容。具體來說:

  • 在 libstdc 中,std::string 是引用計數的。
  • 在 libc 中,std::string 使用「短字串最佳化」(SSO),它具有不同的記憶體佈局和行為。

解決方案:

要解決此問題,您必須使用Clang 以libc 作為標準庫重建Boost:

clang++ -stdlib=libc++ ...
登入後複製

二進位不相容的原因:

為了防止二進位不相容導致的意外混合和運行時崩潰,libc 利用C 11 的內聯命名空間功能來修改ABI(應用程式二進位介面) std::string 同時保持相同的API(應用程式介面)。這可確保連結器可以區分來自 libstdc 的 std::string 和來自 libc 的 std::string 。

以上是為什麼在 C 0x 模式下使用 libc 的 Clang 無法連結 Boost::program_options 範例?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!