首页 文章

如何使用GMP,MPFR,MPC,ELF逐个安装GCC,无需共享库?

提问于
浏览
107

如何使用当前版本逐个安装GCC(GNU编译器集合),
使用正确版本的依赖项,而不是使用包管理器(如yum,rpm,apt,dpkg),而不使用共享库?

典型的开发人员可能希望以典型的方式安装GCC,使用您的包管理器(yum,rpm,apt,dpkg,port,brew等)或按照此处的说明(http://gcc.gnu.org/wiki/InstallingGCC) .

我的问题是如何一块一块地安装GCC,没有共享库 .

  • 我想要一个完全独立的GCC,可以在不使用任何共享库的情况下在我的系统中移动,而无需创建任何共享库 .

  • 这就是GCC所称的"the difficult way",不建议普通用户使用 .

GCC取决于:

  • GMP:GNU多精度算术库

  • MPFR:GNU多精度浮点舍入库

  • MPC:GNU多精度C库

  • ELF:可执行和可链接格式库

  • PPL:Parma Polyhedra库(可选,用于内存优化)

6 回答

  • 116

    简单的方法

    如果您是典型的开发人员,可以使用http://gcc.gnu.org/wiki/InstallingGCC中的说明或系统软件包管理器安装简便方法,例如:

    apt  install gcc  # for Debian, Ubuntu, etc.
    yum  install gcc  # for RedHat, CentOS, etc.
    brew install gcc  # for Mac OS X
    

    艰难的道路

    GCC说这里的答案是“艰难的”,因为它逐个构建所有东西,并且不使用共享库 .

    GCC基础设施

    获得GCC基础设施:

    ftp://gcc.gnu.org/pub/gcc/infrastructure/
    

    将下载放在临时目录中(您可以使用您想要的任何目录) .

    /opt/downloads
    

    在与下载目录或其子目录不同的临时目录中构建基础结构:

    /tmp/gcc
    

    使用如下静态库配置基础结构:

    ./configure --disable-shared --enable-static --prefix=/tmp/gcc
    

    --disable-shared标志可能值得仔细查看,具体取决于您的需求 . 我使用--disable-shared因为我只构建静态代码,并且我想确保我不构建任何共享代码 . 我需要的是轻松地将生成的GCC移动到我的驱动器周围,所以我想要所有静态代码,而且我不需要任何共享代码 . 如果您更喜欢共享代码,请省略--disable-shared标志 .

    版本

    当您运行此答案中的任何命令时,请务必更新命令以使用符合您需要的当前GCC版本号 . 本答案中的命令适用于GCC 4.6.2 .

    请注意,GCC文档说:“虽然任何足够新版本的所需工具通常都有效,但库要求通常更为严格 . 新版本可能在某些情况下有效,但使用所记录的确切版本更安全 . ”

    GMP

    GMP是GNU多精度算术库 .

    wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
    bunzip2 gmp-4.3.2.tar.bz2
    tar xvf gmp-4.3.2.tar
    cd gmp-4.3.2
    ./configure --disable-shared --enable-static --prefix=/tmp/gcc
    make && make check && make install
    

    MPFR

    MPFR是GNU多精度浮点舍入库 . 这取决于GMP .

    wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
    bunzip2 mpfr-2.4.2.tar.bz2
    tar xvf mpfr-2.4.2.tar
    cd mpfr-2.4.2
    ./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
    make && make check && make install
    

    MPC

    MPC是GNU多精度C库 . 这取决于GMP和MPFR .

    wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
    tar zxvf mpc-0.8.1.tar.gz
    cd mpc-0.8.1
    ./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
    make && make check && make install
    

    ELF

    ELF代表可执行和可链接格式 . 该库提供与体系结构无关的大小和endian支持 .

    wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
    tar zxvf libelf-0.8.13.tar.gz
    cd libelf-0.8.13
    ./configure --disable-shared --enable-static --prefix=/tmp/gcc
    make && make check && make install
    

    海湾合作委员会

    GCC是GNU编译器集合 . 它取决于GMP,MPFR,MPC和ELF .

    wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz
    tar zxvf gcc-4.6.2.tar.gz
    

    在同一个挂载点的scratch目录中构建gcc . (在/ tmp中构建它会触发交叉编译主机问题)

    mkdir -p /opt/downloads/gcc-4.6.2-scratch
    cd /opt/downloads/gcc-4.6.2-scratch
    

    configure命令及其标志必须全部在一个命令行上(由于网页宽度,此帖子在单独的行中显示它们) .

    注意:我们使用完整路径进行配置,不要设置库路径环境变量 . 我们选择禁用引导程序并禁用共享库,因为我们不希望它们(典型用户可能想要两者),并使用posix线程和默认标志,因为我们需要它们(典型用户可能想要使用其他线程或跳过默认标志) . YMMV并阅读有关标志here

    /opt/downloads/gcc-4.6.2/configure
      --disable-shared
      --disable-bootstrap
      --disable-libstdcxx-pch
      --enable-languages=all
      --enable-libgomp
      --enable-lto
      --enable-threads=posix
      --enable-tls
      --with-gmp=/tmp/gcc
      --with-mpfr=/tmp/gcc
      --with-mpc=/tmp/gcc
      --with-libelf=/tmp/gcc
      --with-fpmath=sse
    make && make install
    

    此页面非常适合GCC安装信息,如何构建它,各种标志等:

    http://www.acsu.buffalo.edu/~charngda/cc_build.html

    更新

    ppl库可用于内存优化:请参阅bugseng.com/products/ppl/Download(在评论中感谢Paul)

    您可以从gcc源目录运行./contrib/download_prerequisites . (感谢NdP on reddit)

  • 6

    接受的答案使得 far 比必要的更复杂,并且对于所有版本都不正确 . 使用 --disable-shared 构建GCC通常是一个非常糟糕的主意 . 请参阅http://gcc.gnu.org/wiki/InstallingGCC以获得更简单的方法 .

    entire 过程应该不比这更困难(将4.6.2替换为您要构建的版本):

    tar xzf gcc-4.6.2.tar.gz
    cd gcc-4.6.2
    ./contrib/download_prerequisites
    cd ..
    mkdir objdir
    cd objdir
    $PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 
    make
    make install
    

    (但请阅读上面的链接,它包含有用的信息 . )

    显然,Ubuntu上的一些人在他们的环境中设置了大量垃圾,干扰了GCC的构建过程,他们需要首先删除它:

    unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
    
  • 0

    我在一个集群上工作 . 只有主节点连接到Internet . 节点上的软件已过时,通常无法维护 . 我没有root访问权限 . 我有两个选择:

    • 构建我需要的静态软件(计算包);要么

    • 构建静态编译器 .

    我选择了第二个并建造了gcc,g和gfortran .

    我把一切都建成了

    PREFIX=$HOME/cmp/soft/sft
    

    并且__956818_我用过

    THREADS=8
    

    下面,gcc是用

    • GMP

    • MPFR

    • MPC

    • ISL

    • CLOOG

    可以从这里获得最新的gcc:ftp://gcc.gnu.org/pub/gcc/releases

    依赖关系在这里找到:ftp://gcc.gnu.org/pub/gcc/infrastructure

    依赖关系

    我使用以下脚本获得依赖:

    #!/bin/sh
    
    # ===========
    ## variables:
    
    GMP=gmp-4.3.2.tar.bz2
    MPFR=mpfr-2.4.2.tar.bz2
    MPC=mpc-0.8.1.tar.gz
    ISL=isl-0.12.2.tar.bz2
    CLOOG=cloog-0.18.1.tar.gz
    
    MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure
    
    
    # ===========
    ## functions:
    
    extract() {
        if [ -f $1 ]; then
            case $1 in
                *.tar.bz2)   tar xvjf $1    ;;
                *.tar.gz)    tar xvzf $1    ;;
                *.bz2)       bunzip2 $1     ;;
                *.rar)       unrar x $1     ;;
                *.gz)        gunzip $1      ;;
                *.tar)       tar xvf $1     ;;
                *.tbz2)      tar xvjf $1    ;;
                *.tgz)       tar xvzf $1    ;;
                *.zip)       unzip $1       ;;
                *.Z)         uncompress $1  ;;
                *.7z)        7z x $1        ;;
                *)           echo "I don't know how to extract '$1'..." ;;
            esac
        else
            echo "'$1' is not a valid file!"
        fi
    }
    
    # ======================
    ## download and extract:
    
    wget $MIRROR/$GMP
    extract $GMP
    
    wget $MIRROR/$MPFR
    extract $MPFR
    
    wget $MIRROR/$MPC
    extract $MPC
    
    wget $MIRROR/$ISL
    extract $ISL
    
    wget $MIRROR/$CLOOG
    extract $CLOOG
    

    以下使用以下bash函数:

    mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
    

    以下每个命令都将在刚刚下载的lib的目录中发布 .

    GMP

    mkdircd build
    ../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
    make -j $THREADS && make check && make install
    

    MPFR

    mkdircd build
    ../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
    make -j $THREADS && make install
    

    MPC

    mkdircd build
    ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
    make -j $THREADS && make install
    

    ISL

    mkdircd build
    ../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
    make -j $THREADS && make install
    

    CLOOG

    mkdircd build
    ../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog
    make -j $THREADS && make install
    

    gcc

    mkdircd build
    export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib
    export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
    export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
    ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran
    make -j $THREADS bootstrap && make install
    
  • 1

    使用Jonathan上面提到的,除了我必须手动下载gmp和mpfr并创建软链接(gcc 4.4.2发布可能没有“download_prerequisites”)

    cd src/gcc-4.4.2
    ln -s ~/linux64/gmp-4.2.1  gmp
    ln -s ~/linux64/mpfr-2.3.0 mpfr
    

    顺便说一句,使用“-with-gmp”和“with-mpfr”和“./configure”给了我“configure:error:无法计算目标文件的后缀:无法编译” . 因此我下载了gmp和mpfr的srcs,然后从gcc src top leve dir中创建了它的软链接

  • 111

    在尝试安装GCC依赖项(包括 GMP, MPFRMPC. )之后,我遇到了其他安装要求,错误和丢失的文件;比如MPFR安装所需的gmp.h头文件 . 您将在此过程中遇到许多问题 . 但是,使用自动链接可以更轻松地构建和安装 GCC-X.0.0later 版本 .

    OPTION ONE.

    为了省去使用make构建的问题,make install和链接动态库,简单地说:

    • 下载您的GCC-X.0.0 -version(最新版本来自:https://gcc.gnu.org/

    • 将gcc-X-000.tar.gz文件解压缩到某个位置/ somepath / .

    • 一旦提取了.tar.gz文件,运行位于/ somepath /或源目录的./contrib/download_prerequisites脚本 .

    • 此脚本将下载支持库,包括: GMP, MPFRMPC 并将为您创建一个符号链接,它将自动作为gcc安装过程的一部分 BUILD 所有gcc依赖项 .

    无需通过发出Make,Make Install或运行./configure文件或添加诸如--with-gmp = / gmp_path / ... / .....之类的链接来构建和链接下载到/ somepath /的支持库 . , - with-mpfr = / mpfr_path / ... / ...因为这是在运行创建符号链接的脚本时完成的 .

    OPTION TWO.

    • 使用OS软件包管理系统在标准系统位置安装支持库 . 对于包含Ubuntu的基于Debian的系统,请安装 libgmp-dev, libmpfr-devlibmpc-dev 包 . 对于包含Fedora和SUSE的基于RPM的系统,请在SUSE上安装 gmp-devel,libmpc-develmpc-devel )包 .

    • 此选项将库和头文件安装在标准系统目录中,在构建GCC时将自动找到它们 .

    • 当您调用"sudo apt-get install libgmp-dev"或"sudo apt-get install libmpfr-dev" install并完成链接时,这是OS软件包安装管理的优势 . 此外,您不必使用Make,Make install或./configure构建支持库 . 此外,该过程需要几分钟才能完成所有过程 .

    • 现在您可以继续进行GCC安装 .

    CONFIGURATION:

    This is the GCC config Process, with gcc-X-000.tar.gz
    

    问题:

    tar -xvf gcc-X-000.tar.gz 
    cd gcc-X-000
    ./contrib/download_prerequisites
    cd ..
    mkdir objdir
    /../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib
    make -j 2
    make install
    

    注意:

    • 启用语言,如c或c .

    --disable-multilib的;根据您的系统和操作系统禁用multilib,系统将提示您继续执行multilib .

    制作需要很长时间才能完成 . 但是,您可以发出选项-j #no_pro . 这将根据PC或Mac上的处理器数量并行运行Make并行 .

    有关如何执行此过程的详细信息,请访问:https://gcc.gnu.org/wiki/InstallingGCC .

  • 24

    我跟随了joelparkerhenderson最受欢迎的答案 . 这是我在@ NIX系统上安装的最佳答案互联网 .

    对于后代,我想补充一点,如果你得到一个错误,如“安装错误:无法计算目标文件的后缀:无法编译”

    然后用/ tmp / gcc / lib更新你的LD_LIBRBARY_PATH(参见joelparkerhenderson的完整答案)

    / tmp / gcc / lib包含所有必需的mpfr / mpc / gmp文件,运行时链接器无法找到它们,除非您将它们添加到LD_LIBRARY_PATH . 也不要忘记导出LD_LIBRARY_PATH;) . 更多背景信息:https://gcc.gnu.org/wiki/FAQ#configure_suffix

相关问题