參考:http://www.linuxfromscratch.org/blfs/view/stable/general/gcc.html
下載地址在這里:https://ftp.gnu.org/gnu/gcc
編譯之前需要做准備工作。
yum -y groupinstall "Development Tools"
yum -y install zlib-devel
我用的是這個
../configure \
--prefix=/usr/local/gcc-6.2.0 \
--disable-multilib \
--with-system-zlib \
--enable-languages=c,c++,go &&
make -j4
注:實際發現對gcc-6.2.0不能用make -j40,對gcc-6.3.0用make -j20是可以的。
編譯gcc-6.4.0時,似乎用 -j12是可以編譯的。
網頁上的命令是:
../configure \ --prefix=/usr \ --disable-multilib \ --with-system-zlib \ --enable-languages=c,c++,fortran,go,objc,obj-c++ && make
有的語言不需要,我就刪掉了。保留go,是為了將來和erlang做比較。
結果編譯出現問題,但以前有一次,沒有用make -j4,用make編譯
是成功的。
按照錯誤提示,刪除一些東西,反復嘗試幾次,經過對個別目錄make,最后解決問題。
編譯提示需要 gmp,mpfr和mpc,通過yum方式安裝:
yum -y install gmp-devel
yum -y install mpfr-devel
yum -y install libmpc-devel
似乎libmpc-devel依賴前兩個,安裝這個的時候,前兩個也被安裝了。
不采用這種方式安裝gmp, mpfr和mpc,可以通過https://www.mawenbao.com/note/install-gcc-5.2.0-from-source.html 提示的來編譯安裝。
就是: make -j4時出現了問題,然后需要解決個別問題,用make來解決。以后再次編譯的時候,
1. 需要先make distclean, and/or rm ./config.cache
2. 編譯時,如果可以利用晚上時間編譯,就make, 不加 "-j4"。
如果提示類似於“../../mpfr/mpfr.h:334:55: error: expected ‘)’ before ‘mpfr_rnd_t’”一類的錯誤,那么可能是yum安裝的gmp,mpfr或者
libmpc版本不適合本次編譯,可以執行:
sh contrib/download_prerequisites 來把依賴項准備好。編譯的時候,會編譯這些依賴項的。
要容許多個gcc版本存在,可以把原來的/usr/bin/gcc改為/usr/bin/gcc4.4.7(我的版本是這個),然后在/usr/local/bin寫gcc6.2.sh和gcc4.7.sh,內容分別是
ln -sf /usr/local/gcc-6.2.0/bin/gcc /usr/bin/gcc
....
這樣的內容。
gcc6.4.0是6系列里版本最高的, https://ftp.gnu.org/gnu/gcc/gcc-6.4.0/gcc-6.4.0.tar.gz。
編譯完gcc-6.3.0,測試發現,說是運行時,version `GLIBCXX_3.4.22' not found。 因為make install時,沒有把libstdc++.so.6.0.22拷貝到/usr/lib64下。
應該拷貝過去,另外把libstdc++.so.6重新鏈接下。另一個方法是把安裝的目錄:/usr/local/gcc-6.3.0/lib64 給放到 /etc/ld.so.conf下或者/etc/ld.so.conf/xxxx中。
可以用"strings /usr/lib64/libstdc++.so.6 | grep GLIBC" 來查看。
gcc 8.2.0的編譯如下:
Installing latest major version of gcc: gcc 8 (GCC 8.2.0) - released 07/26/2018:
GCC 8.2 is a bug-fix release for gcc 8.1.0, containing substantial new functionality not available in GCC 7.x or previous GCC releases.
Download file: https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.gz
Compile and install:
//required libraries:
yum install libmpc-devel mpfr-devel gmp-devel -y
yum install zlib-devel*
./configure --prefix=/usr/local/share/gcc-8.2.0 --with-system-zlib --disable-multilib --enable-languages=c,c++
make -j 8 <== this may take around 75 minutes or less to finish with 8 threads
(depending on your cpu speed)
make install
提醒一下,這個有人 make -j 8 在8核機器上要花75分鍾,我請系統管理員在虛擬機上調成了30個核,這下編譯就非常快了。但這樣編譯,出現過3次錯誤。最后改為:-j 10就編譯成功了。
用這個gcc編譯時,發現gcc 8或gcc 7的版本對於下面的錯誤沒法解決,遍尋google也沒有好辦法。
error: ‘%s’ directive output may be truncated writing up to 1023 bytes into a region of size 84 [-Werror=format-truncation=]
以后發現能解決了,Makefile中增加:
ifeq ($(shell test $(GCC_VERSION) -ge 70 && echo 1), 1)
CFLAGS +=-Wno-format-truncation
endif
最后說一下make -j 的事情。編譯gcc-6.4.0時,make -j30出錯,改為make -j10, make -j4,還是有錯誤;出現錯誤后,make 也不行。趁着晚上,make clean && make,第二天過來看,編譯成功了。18點開始編譯,22點編譯結束,機子是一個cpu的虛擬機。實際操作的時候怎么辦呢,就是准備兩個同樣的目錄,一個就make,另一個make -jxx。
說說不通過編譯用yum的方式
The best approach to use yum and update your devtoolset is to utilize the CentOS SCLo RH Testing repository.
yum install centos-release-scl-rh
yum --enablerepo=centos-sclo-rh-testing install devtoolset-7-gcc devtoolset-7-gcc-c++
Many additional packages are also available, to see them all
yum --enablerepo=centos-sclo-rh-testing list devtoolset-7*
該方法之在centos6上成上能成功,在centos7上,有的能成功,最近是沒有成功。