• 编译GCC遇到的问题


    编译gcc 4.8.5

    可以再环境上 gcc -v 查看下当前的gcc编译时都指定哪些参数。然后进行相应的调整即可

    ./configure --prefix=/opt/xxx/xxx --with-gmp=/opt/gmp/xxx --with-mpfr=/opt/mpfr/xxx --with-mpc=/opt/mpc/xxx --build=x86_64-linux

    编译gcc 7.5.0

    ./configure --prefix=/opt/xxx/xxx --with-gmp=/opt/gmp/xxx --with-mpfr=/opt/mpfr/xxx --with-mpc=/opt/mpc/xxx --build=x86_64-linux --enable-bootstrap --enable-languages=c,c++ --disable-multilib

    安装如下依赖库:

    https://ftp.gnu.org/gnu/mpfr/

    https://ftp.gnu.org/gnu/gmp/

    https://ftp.gnu.org/gnu/mpc/

    ====================================================

    1、了解一下gcc  

      目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。我自己linux上是4.1.2版本,是不支持openMP的,而自己又要用到openMP,所以自己在原来的基础上安装了一个4.2以上版本的。

      在安装之前,系统必须有cc或者gcc的编译器,如果没有,就不能安装更高版本的gcc了,如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。

      本文介绍的是以源代码安装gcc的过程,我安装的是在一个单独的目录下,以后想卸载的话,直接删除该目录就行,本文介绍的是安装4.3.4版本的详细过程。只需要按照以下步骤来一步一步安装就行。

    2、需要下载的安装包

    2.1 下载gcc

      下载网址是http://ftp.gnu.org/gnu/gcc/,可以根据自己的需要下载哪个版本,我选择的是4.3.4版本。里面有gcc-4.3.4.tar.bz2,gcc-4.3.4.tar.gz,任意选一个就行,它们是完全一个样的。我选择的是gcc-4.3.4.tar.gz。还可以查看Changes: http://gcc.gnu.org/gcc-4.5/changes.htm,相比上一个版本有哪些改变,自己随便看就行

    2.2 下载3个依赖包

      一个是mpc,一个是gmp,一个是mpfr,下载地址依次为:ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.2.tar.gz,ftp://ftp.gnu.org/gnu/gmp/gmp-5.0.1.tar.bz2 ,http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.2.tar.gz。安装的顺序依次为:GMP,mpfr, mpc,最后安装gcc。我开始就直接安装gcc,在配置过程出现以下信息:

    configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify

    their locations. 

      提示安装gcc之前,必须安装GMP 4.2以上版本,MPFR2.3.1以上版本, MPC 0.8.0以上版本。

    3、安装步骤

    3.1 安装GMP-5.0.1.

      我这里选择的是GMP5.0.1版本,解压gmp-5.0.1后,得到源代码目录,创建一个临时编译目录temp。

    $ tar -jxvf gmp-5.0.1.tar.bz2
    $ cd gmp-5.0.1
    $ mkdir temp
    $ cd temp

    开始配置安装目录,进入temp目录后,输入以下命令:

    $ ../configure --prefix=/usr/local/gmp-5.0.1

    $ make

    $ make install

    这样gmp就安装完成了。安装mpfr和mpc过程也差不多,只是安装的时候得加入依赖项

    3.2 安装mpfr

      我这里选择的是3.1.2版本的mpfr。解压,建立临时编译目录temp,进入temp目录

    $ tar -zxvf mpfr-3.1.2.tar.gz 

    $ cd mpfr-3.1.2

    $ mkdir temp

    $ cd temp

    $ ../configure --prefix=/usr/local/mpfr-3.1.0 --with-gmp=/usr/local/gmp-5.0.1

    $ make

    $ make install

     其中--with=/usr/local/gmp-5.0.1就是依赖项, /usr/local/gmp-5.0.1是gmp的安装目录

    3.3 安装mpc

      我选择的是1.0.2版本mpc.解压,建立临时编译目录temp,进入temp目录.

    $ tar -zxvf mpc-1.0.2.tar.gz

    $ cd mpc-1.0.2

    $ mkdir temp

    $ cd temp

    $ ../configure --prefix=/usr/local/mpc-1.0.2 --with-gmp=/usr/local/gmp-5.0.1 --with-mpfr=/usr/local/mpfr-3.1.0

    $ make

    $ make install

    记得后面两项的依赖项,也就是你的gmp和mpfr的安装目录

    3.4 安装gcc

      前面安装的三个,都是为安装gcc做准备的。解压gcc的安装包

    $ tar zxvf gcc-4.3.4.tar.gz 或者 $ tar jxvf gcc-4.5.1.tar.bz2

    得到的目录gcc-4.3.4就是源目录,用${srcdir}表示。在gcc-4.3.4里的INSTALL目录里就有安装的详细过程,那全都是英文的,里面的源目录也是用${srcdir}表示。我是解压在/usr/local/src/gcc-4.3.4目录里。

      建立目标目录

    $ mkdir /usr/local/gcc-4.3

    $ cd gcc-4.3

    这是目标目录,也就是编译的目录,然后以下所有的操作都在该目录下进行.用${objdir}

      建立安装目录

    $ mkdir /usr/local/gcc-4.3.4

    这是你gcc安装的地方。用${destdir}表示。开始进行配置

    $ ${srcdir}/configure --prefix=${destdir} [其它选项]

    安装的时候记得把真实目录替换掉${srcdir}和${destdir}。我的是这么写的

    $ /usr/local/src/gcc-4.3.4/configure --prefix=/usr/local/gcc-4.3.4 --enable-threads=posix --disable-checking --enable--long-long --enable-languages=c,c++,java --with-gmp=/usr/local/gmp-5.0.1 --with-mpfr=/usr/local/mpfr-3.1.0 --with-mpc=/usr/local/mpc-1.0.2

    记得加上后面三个依赖项,否则会出刚开始出现的错误的。然后安装

    $ make

    $ make install

    安装的时候等挺长时间,差不多两个小时。

    3.5 gcc、g++、gcj设置

      要想使用GCC 4.3.4的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。

      而原来gcc的路径是在usr/bin下。我们可以把gcc 4.3.4中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接:

    $ cd /usr/bin

    $ ln -s /usr/local/gcc-4.3.4/bin/gcc gcc434

    $ ln -s /usr/local/gcc-4.3.4/bin/g++ g++434

    $ ln -s /usr/local/gcc-4.3.4/bin/gcj gcj434

      这样,就可以分别使用gcc434、g++434、gcj434来调用GCC 4.1.2的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。

    3.6 库路径的设置

    将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,例如,如果GCC 4.3.4安装在/usr/local/gcc-4.3.4目录下,在RH Linux下可以直接在命令行上执行

    $ export LD_LIBRARY_PATH=/usr/local/gcc-4.3.4/lib

    最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了,在文件$HOME/.bash_profile中添加下面两句:

    LD_LIBRARY_PATH=:/usr/local/mpc-1.0.2/lib:/usr/local/gmp-5.0.1/lib:/usr/local/mpfr-3.1.2/lib:/usr/local/gcc-4.3.4/lib

    export LD_LIBRARY_PATH

    或者在/etc/bash_profile 下添加。

    重启系统设置生效,或者执行命令

    $ source $HOME/.bash_profile

    或者:

    $ source /etc/bash_profile

    用新的编译命令(gcc412、g++412等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。

    完成了Linux安装GCC,之后你就能轻松地编辑了。

    在64位CentOS上编译GCC-4.8时,出现了GCC: Linux gnu/stubs-32.h: No such file or directory的错误。


    查资料得知,这是缺少32位的嵌入式C库。在嵌入式开发环境配置时,也常遇到这个问题。


    各平台的解决办法:

    Debian Linux:

    $ sudo apt-get install libc6-dev


    Ubuntu Linux:

    $ sudo apt-get install libc6-dev-i386


    OpenSUSE / Novell Suse Linux (SLES):

    # zypper in glibc-devel-32bit


    RHEL / Fedora / CentOS / Scientific Linux:

    $ sudo yum install glibc-devel.i686

    问题1:gcc源码自身编译,找不到库的问题

    gcc-7.3.0/host-x86_64-pc-linux-gnu/gcc/cc1: error while loading shared libraries: libisl.so.15: cannot open shared object file: No such file or directory
    make[3]: *** [s-selftest] Error 1
    make[3]: Leaving directory `/root/Downloads/gcc-7.3.0/host-x86_64-pc-linux-gnu/gcc'
    make[2]: *** [all-stage1-gcc] Error 2
    make[2]: Leaving directory `/root/Downloads/gcc-7.3.0'
    make[1]: *** [stage1-bubble] Error 2
    make[1]: Leaving directory `/root/Downloads/gcc-7.3.0'

    # 在"/usr/local/lib"目录下,怎么就找不到库libisl.so。

    解决方法是:加到"/etc/ld.so.conf"或用"LD_LIBRARY_PATH"。

    vi /etc/ld.so.conf  #添加库的路径/usr/local/lib/

    然后终端命令行执行ldconfig,再重新编译。

    问题2:gcc升级完成之后,编译项目工程时遇到的软连接问题

    /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found

    解决办法:https://blog.csdn.net/libaineu2004/article/details/77100132

    有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
  • 相关阅读:
    sprinf sprintf_s 的用法
    c++中static的用法详解
    C++数值类型与string的相互转换
    setTimeout(function(){}, 0);
    学习 Node.js 的 6 个步骤
    $destroy——angular
    模态框——angular
    日期控件
    前端加密
    ui-router
  • 原文地址:https://www.cnblogs.com/axjlxy/p/15156142.html
Copyright © 2020-2023  润新知