滴滴雲GPU雲主機上的GCC編譯
有滴滴雲 GPU 雲主機的使用者反饋,在使用 GPU 主機的時候,有些應用場景需要比較高版本的 GCC,如 GCC5.2,而自己構建時碰到了一些狀況,不好解決。
會有多種情況導致需要高版本的 GCC,其中有一種情況是對 Cxx 支援能力的要求。這裡列上 GCC 對 Cxx 支援能力的連結 https://gcc.gnu.org/projects/cxx-status.html 以做備查。
另外一種情況是GLIBCXX 的版本問題,可以通過構建新的 GCC 來解決,但本質是因為構建 GCC 過程中構建了新的 libstdc++ 庫,所以可以通過直接構建新的 libstdc++ 來解決,而不需要構建整個 GCC。
還有一種特別的情況,GLIBC 的版本問題,跟 libstdc++ 類似,可以通過構建 glibc 庫來解決,但是由於 libc 這個庫非常特殊並且很重要,大量的命令動態依賴於這個庫,所以此處不建議使用者構建 glibc 庫。
區分這些情況便於決定要怎麼解決問題。迫切需要但又未曾接觸過 GCC 編譯的使用者,編譯 GCC 時可能會覺得茫然無措,但其實較新版本的 GCC 編譯過程是相當清晰明瞭的。
以下內容以 GCC5.2 為例,在本地做 GCC 的編譯。
下載後解壓
從 GCC 官網上下載 GCC5.2 版本,下載過程不作贅述。根據不同的壓縮格式選擇不同解壓縮命令,此處以 .tar.bz2 為例:
tar -xjvf gcc-5.2.0.tar.bz2
如果是 gzip 格式,使用 tar -xzvf 引數;·
解決依賴
GCC 從較新版本開始,提供了下載依賴項的指令碼,強烈建議使用該指令碼下載依賴,自己安裝下載很容易出錯。
進入解壓後 GCC 根目錄,執行以下操作:
cd gcc-5.2.0
./contrib/download_prerequisites
等待該指令碼正確執行完畢。
構建
特別注意,如果確定需要重新編譯 GCC,請務必留意規格,編譯相對會耗一些資源,如果規格不合適,很可能會編譯失敗。構建 GCC 會需要一段時間,並且對記憶體等有一定要求。本文使用的配置是 16C32G。
建立構建目錄。較新的 GCC 構建都建議在獨立的構建目錄中做操作,結合上文下載完依賴之後,退出 GCC5.2 目錄,然後建立並進入構建目錄:
cd ../
mkdir gcc-build
cd gcc-build
配置:
需要安裝到哪個路徑下,通過 prefix 指定,不需要 32 位的相容庫的話新增 --disable-multilib ,建議這麼做是因為如果編譯 32 位的相容庫,還會需要解決不少依賴。
簡單的配置如下:
../gcc-5.2.0/configure --prefix=/opt/gcc --enable-languages=c,c++ --disable-multilib
構建:
make -j 16
安裝
構建完之後安裝
sudo make install
特別注意 install 後的一段說明,具體說明如下:
Libraries have been installed in:
/opt/gcc/lib/../lib64
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
要使用構建後的 GCC,還需要做一些環境變數的配置,環境路徑與上述 prefix 配置相關,本例中配置如下:
export PATH=/opt/gcc/bin/:$PATH
export LD_LIBRARY_PATH=/opt/gcc/lib64/:$LD_LIBRARY_PATH
執行 gcc/g++ 命令和結果如下:
$ gcc --version
gcc (GCC) 5.2.0
Copyright © 2015 Free Software Foundation, Inc.
本程式是自由軟體;請參看原始碼的版權宣告。本軟體沒有任何擔保;
包括沒有適銷性和某一專用目的下的適用性擔保。
$ g++ --version
g++ (GCC) 5.2.0
Copyright © 2015 Free Software Foundation, Inc.
本程式是自由軟體;請參看原始碼的版權宣告。本軟體沒有任何擔保;
包括沒有適銷性和某一專用目的下的適用性擔保。
之後可以嘗試使用該 gcc/g++ 來編譯程式了。
相關一些命令
檢視 libstdc++ 庫支援的 GLIBCXX 版本:
strings libstdc++.so | grep GLIBCXX
檢視 libc 庫版本支援的 GLIBC 版本:
strings /usr/lib64/libc.so.6 | grep GLIBC
檢視 GCC 每一個優化項打開了哪些優選引數:
$ gcc -Q --help=optimizers
有興趣的使用者可以對比觀察系統預設版本的優化項和新構建的優化項之間的差異。