為什麼在C 0x 模式下使用libc clang 無法連結Boost::Program_Options 範例
給定的程式碼片段演示了嘗試編譯時出現的問題並在C 0x 模式下利用libc 將boost::program_options 與clang 連結。
問題分析
編譯錯誤源自於 libc 和 libstdc (預設標準)之間的不相容由 g 實作的函式庫。 libc 對 std::string 採用了不同的實作細節,引入了與 libstdc 的 ABI(應用程式二進位介面)差異。
解決方案
要解決此問題,有必要使用帶有 -stdlib=libc 標誌的 clang 重建 Boost。這確保了 Boost 函式庫是針對可執行檔連結的相同標準函式庫進行編譯的。它協調了 Boost 函式庫和正在編譯的程式中 std::string 的 ABI。
技術說明
libc 利用內嵌命名空間改變 std 的 ABI: :string 而不修改其 API。這會在兩個函式庫之間產生明顯的差異,其中 libstdc 中的 std::string 和 libc 中的 std::__1::string 被連結器視為不同的資料結構。
透過使用適當的標準重建 Boost庫中, boost::program_options 的符號定義與連結器期望的符號定義相匹配,從而能夠成功連結。
以上是為什麼在 C 0x 模式下使用 libc 的 Clang 無法連結 Boost::Program_Options?的詳細內容。更多資訊請關注PHP中文網其他相關文章!