Gcc

指定要使用的 libstdc++

  • March 16, 2022

我想使用更新的 GCC 版本。因此,我編譯了 GCC 10 並將其安裝到非標準目錄/software/gcc10/中。到目前為止,一切都很好。

但是,當我真正想使用這個新版本的 GCC 時,我遇到了一些問題。我修改了我的PATH變數以包含/software/gcc10/bin/現在gcc --version確認系統找到我的新 GCC 10 編譯器(而不是我係統的 GCC 8 編譯器)。

但是,當我嘗試使用此設置編譯程序時,我收到有關未定義引用的錯誤std::filesystem,這應該是 GCC 10 的 libstdc++ 的一部分。我在這裡的假設是,雖然我現在使用的是更新的編譯器,但連結器仍然希望連結到我係統的 libstdc++ 而不是/software/gcc10/lib64.

我嘗試更改LD_LIBRARY_PATH以包含相應的目錄,但這似乎沒有任何效果。

檢查gcc使用該-v選項執行的輸出時,我偶然發現了LIBRARY_PATH環境變數,根據gcc 的文件,它的使用如下:

LIBRARY_PATH 的值是一個以冒號分隔的目錄列表,很像 PATH。當配置為本地編譯器時,如果 GCC 使用 GCC_EXEC_PREFIX 無法找到它們,則 GCC 在搜尋特殊連結器文件時會嘗試指定的目錄。在為 -l 選項搜尋普通庫時,使用 GCC 進行連結也使用這些目錄(但使用 -L 指定的目錄首先出現)。

事實上:LIBRARY_PATH相應地設置變數可以讓我成功編譯我的程序。但是,這似乎是一個特定於 gcc 的解決方案,我不禁想知道是否有更標準的方法來執行此操作(例如,這也會告訴 clang 在哪裡尋找要連結的 C++ 標準庫)?

更好的解決方案是使我的新 GCC 10 編譯器始終使用 GCC 10 標準庫,而係統的 GCC 8 編譯器的呼叫將始終連結到系統 GCC 8 標準庫。有沒有辦法告訴特定的編譯器二進製文件它有一個應該使用的特定 stdlib?

LIBRARY_PATH環境變數非常標準。大多數編譯器都知道它。

您還應該使用C_INCLUDE_PATH和/或CPLUS_INCLUDE_PATH. 這兩個更特定於 gcc(其他編譯器更喜歡INCLUDE沒有語言分離)。

您也可以完全忽略環境變數,直接在命令行中指定正確的 libstdc++。

g++ main.cpp /software/gcc10/.../libstdc++.a

引用自:https://unix.stackexchange.com/questions/694637