編譯安裝GCC 5.2.0


https://blog.atime.me/note/install-gcc-5.2.0-from-source.html

 

記錄編譯GCC 5.2.0時遇到的問題和解決方法,以備日后查詢。

平時使用的服務器是CentOS5,自帶的gcc編譯器還是8年前發布的4.1.2版本,完全沒法寫C++11的代碼,因為不想升級操作系統,只好自己下載源碼編譯。

安裝過程挺dan疼的,只好記錄下來。

安裝依賴庫

GCC依賴於gmp 4.2+, mpfr 2.4+和mpc 0.8+,這里直接下載安裝最新的版本。

為了省事,所有的庫都直接裝到/usr/local目錄下的對應目錄。(不要在生產環境上這么干)

安裝gmp 6.0

wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2
tar xvf gmp-6.0.0a.tar.bz2
cd gmp-6.0.0
./configure
make -j4
make check
make install

安裝mpfr 3.1.3

mpfr依賴於gmp。

wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2
tar xvf mpfr-3.1.3.tar.bz2
cd mpfr-3.1.3
./configure --with-gmp-include=/usr/local/include \
    --with-gmp-lib=/usr/local/lib
make -j4
make check
make install

安裝mpc 1.0.3

mpc依賴於gmp和mpfr。

wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
tar xvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --with-mpfr-include=/usr/local/include \
    --with-mpfr-lib=/usr/local/lib \
    --with-gmp-include=/usr/local/include \
    --with-gmp-lib=/usr/local/lib
make -j4
make check
make install

安裝GCC

編譯

建議先閱讀下官方的安裝文檔

下載GCC並解壓。

wget ftp://ftp.gnu.org/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.bz2
tar xvf gcc-5.2.0.tar.bz2
cd gcc-5.2.0

先unset若干個系統變量,以免出現某些宏找不到的情況。

unset CPLUS_INCLUDE_PATH LIBRARY_PATH

配置GCC

./configure \
    --with-gmp-include=/usr/local/include \
    --with-gmp-lib=/usr/local/lib \
    --with-mpfr-include=/usr/local/include \
    --with-mpfr-lib=/usr/local/lib \
    --with-mpc-include=/usr/local/include \
    --with-mpc-lib=/usr/local/lib \
    --enable-languages=c,c++ \
    --enable-threads=posix \
    --disable-multilib

詳細的配置項說明可參考安裝文檔,這里只編譯c和c++的編譯器。

然后make -j8,啟用多線程編譯。

測試

先安裝dejagnu: yum install dejagnu

然后運行如下命令:

make -j8 check-gcc

查看測試結果:

./contrib/test_summary

安裝

如果編譯順利通過,make install即可。

gcc和g++默認被安裝到/usr/local/bin目錄下,libgcc和libstdc++默認被安裝到/usr/local/lib64(x64)。

記得更下下動態庫緩存。

ldconfig

可能遇到的問題

XXXX not defined

遇到某個宏沒有定義的情況,先unset C_INCLUDE_PATH再嘗試。

braced spec is invalid

很dan疼的一個問題,搜遍了全網也沒見有比較正式的解決方案。目前看上去比較靠譜的方法可參考這里,具體操作就是手動改一下某個specs文件。

我這里是host-x86_64-unknown-linux-gnu/gcc/specs,把其中所有的%:sanitize(xxx)改為fsanitize=xxx

測試C++11

寫一個腦殘的cpp測試下新安裝的編譯器。

#include <atomic>
#include <regex> #include <iostream> using namespace std; int main() { atomic<long long> num(1L << 14); cout << ++num << endl; regex r("[0-9]+"); string s("0abc11abc222cba"); sregex_iterator ib(s.begin(), s.end(), r); sregex_iterator ie; cout << "search numbers in: " << s << endl; for (sregex_iterator i = ib; i != ie; ++i) { cout << "match: " << i->str() << endl; } } 

編譯並運行:

/usr/local/bin/g++ -std=c++11 b.cpp -o b
LD_LIBRARY_PATH=/usr/local/lib64 ./b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM