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
