• gcc 6.2.0/6.3.0/8.2.0 编译安装


    参考: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上,有的能成功,最近是没有成功。

    
    
  • 相关阅读:
    Java基础之:构造方法(构造器)与this关键字
    Java基础之:属性与局部变量作用域
    Java基础之:方法重载与可变参数
    Java基础之:成员方法与传参机制
    Java基础之:类与对象
    Java基础之:数组练习题
    Java基础之:二维数组
    Promise对象的简单用法
    如何用vue-cli初始化一个vue项目
    get和post请求的区别
  • 原文地址:https://www.cnblogs.com/tangxiaosheng/p/5916533.html
Copyright © 2020-2023  润新知