指定要使用的 libstdc++
我想使用更新的 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