原文 http://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 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 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 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 <iostream>
using namespace std;
int main() {
atomic<long long> num(1L << 14); cout << ++num << endl; }
编译并运行:
/usr/local/bin/g++ -std=c++11 b.cpp -o b
LD_LIBRARY_PATH=/usr/local/lib64 ./b
--------------------------------------------------------------------------
编译中的问题:
sudo gedit config.log # 查看日志,搜索"error"
# issue: configure: error: C++ compiler missing or inoperational
# 没有C++编译器
yum install gcc-c++
# issue: conftest.cpp:11:2: error: #error -static-libstdc++ not implemented # 没有C,C++静态库 yum install glibc-static libstdc++-static -y # 但报"No package libstdc++-static available",即没有-static-libstdc++源,问题仍存在。 # "checking whether g++ accepts -static-libstdc++ -static-libgcc"时报出的,可忽略。 # issue: conftest.c:10:25: error: isl/version.h: No such file or directory # 没有ISL wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.12.2.tar.bz2 tar jxvf isl-0.12.2.tar.bz2 cd isl-0.12.2; ./configure make; make install cd .. # issue: ./conftest: error while loading shared libraries: libisl.so.10: cannot open shared object file: No such file or directory # 在"/usr/local/lib"目录下,怎么就它找不到。加到"/etc/ld.so.conf"或用"LD_LIBRARY_PATH"。 vi /etc/ld.so.conf # 添加"/usr/local/lib" ldconfig # 重建/etc/ld.so.cache # 自问:于**Issue 1**里,已经单独在"/etc/ld.so.conf.d"下建个"*.conf"添加过"/usr/local/lib",怎么没效果呢? # 自答:之后安装的ISL,没重新ldconfig,所以找不到了?当时没查,不能确认。用以下命令: strings /etc/ld.so.cache | grep libisl # 查看 # 之后,删除了"/etc/ld.so.conf"内的添加,也不再有该问题。 # issue: conftest.c:10:27: error: cloog/version.h: No such file or directory # 没有CLooG wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz tar zxvf cloog-0.18.1.tar.gz cd cloog-0.18.1; ./configure make; make install cd .. # issue: conftest.c:15: error: 'choke' undeclared (first use in this function) # "checking for version 0.17.0 of CLooG"失败报出的,没问题。