在GCC 6.0 的持續開發過程中嘗試利用最新的C 1z 功能時,會出現一個特殊的連結器錯誤:編譯涉及實驗性::filesystem標頭的範例程式碼。
執行階段問題會顯現出以下程式碼:
#include <iostream> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; int main() { fs::path p1 = "/home/pete/checkit"; std::cout << "p1 = " << p1 << std::endl; }
編譯此程式碼會導致下列錯誤:
undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
解決方案:
與原先的假設相反,檔案系統TS 不隸屬於 C 1z,而是構成一個獨特的規範。檔案系統 TS 的 GCC 實作可以在 C 11 模式下存取。若要解決連結錯誤,應將下列標誌新增至連結指令:
-lstdc++fs
此指令保證程式連結至包含實驗::檔案系統頭的必要實作的適當函式庫。
更新:
GCC 的後續版本(8.x 及更高版本)引入支援用於 C 17 檔案系統庫。它可以透過存取。標頭和 std::filesystem 命名空間。在此實現實現穩定之前,仍然需要連結到 -lstdc fs 才能利用這些功能。
從 GCC 9 開始,可以在沒有 -lstdc fs 的情況下使用 C 17 std::filesystem 元件,而 std::experimental ::檔案系統符號透過 GCC 13.3 中的 -lstdc exp 提供。
以上是為什麼在 C 1z 中使用 `experimental::filesystem` 時出現連結器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!