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

joe*_*son 111 gcc elf mpfr gmp mpc

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

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

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

  • 我想要一个完全独立的GCC,可以在不使用任何共享库的情况下在我的系统中移动,而无需创建任何共享库.
  • 这就是GCC所说的"困难之路",不建议普通用户使用.

GCC取决于:

  • GMP:GNU多精度算术库
  • MPFR:GNU多精度浮点舍入库
  • MPC:GNU多精度C库
  • ELF:可执行和可链接格式库
  • PPL:Parma Polyhedra库(可选,用于内存优化)

joe*_*son 121

简单的方法

如果您是典型的开发人员,可以使用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
Run Code Online (Sandbox Code Playgroud)

困难的方式

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

GCC基础设施

获得GCC基础设施:

ftp://gcc.gnu.org/pub/gcc/infrastructure/
Run Code Online (Sandbox Code Playgroud)

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

/opt/downloads
Run Code Online (Sandbox Code Playgroud)

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

/tmp/gcc
Run Code Online (Sandbox Code Playgroud)

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

./configure --disable-shared --enable-static --prefix=/tmp/gcc
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

GCC

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
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch
Run Code Online (Sandbox Code Playgroud)

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

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

/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
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

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

  • 您可以从gcc源目录运行./contrib/download_prerequisites.这个评论归功于Reddit上的N7P. (12认同)
  • `--disable-shared`对大多数人来说是错误的,`--disable-bootstrap`可能会加速构建,但可能会导致它失败,具体取决于现有的gcc版本,默认情况下启用`--enable-libgomp` ,`--enable-lto`默认启用,`--enable-thread-safe`不是有效选项,`--enable-threads = posix`默认在某些平台上启用,对其他平台无效,` - 默认情况下启用enable-tls`,基本上这些指令非常差 (8认同)
  • 不,引导不依赖于它.使用--disable-shared构建GMP,MPFR和MPC而不是GCC本身是有意义的(并且使用download_prerequisites脚本意味着您无需手动构建GMP,MPFR和MPC).构建GCC总是默认构建静态库**和**共享库, - disable-shared只意味着你没有共享库,这对大多数人来说是错误的选择. (3认同)
  • 仅供参考,请务必更新新GCC 4.6.3的上述版本号(或者当您执行此操作时的当前版本号) (2认同)
  • 谢谢乔纳森,他们是我对构建一个完全可移动的 GCC 而无需任何共享库的最佳猜测。您能建议您将使用哪些具体标志吗? (2认同)
  • @einpoklum 你是对的,他们确实如此。您对标题和问题的更好措辞有何建议? (2认同)

Jon*_*ely 115

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

整个过程应该是没有比这(与你想建立的版本替换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
Run Code Online (Sandbox Code Playgroud)

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

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

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说对gcc 6.2.0很有用,绝对应该是接受的答案!(它适用于操作系统/版本等) (4认同)
  • 不,没有错过的一步 (2认同)
  • @ user2023370,GCC知道如何找到它自己的标题和库,当然.您需要设置LD_LIBRARY_PATH以告知动态链接器如何查找库(因为当您运行可执行的GCC时不再参与),请参阅https://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq. how_to_set_paths (2认同)
  • @einpoklum,然后你的"像这样的东西"是不一样的.上面的步骤工作.他们定期为我工作,所有版本的GCC.他们为数百人工作. (2认同)
  • 为了将来参考,这适用于gcc-5.4.0.唯一没有提到的是我必须在此处建议的所有其他内容之前"取消设置LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH`:http://stackoverflow.com/questions/12255058/g-4-7-1-compilation-error -conflicting类型换strsignal (2认同)

Ado*_*obe 24

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

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

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

我把一切都建成了

PREFIX=$HOME/cmp/soft/sft
Run Code Online (Sandbox Code Playgroud)

而且make我用过

THREADS=8
Run Code Online (Sandbox Code Playgroud)

下面,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
Run Code Online (Sandbox Code Playgroud)

以下使用以下bash函数:

mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
Run Code Online (Sandbox Code Playgroud)

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

GMP

mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install
Run Code Online (Sandbox Code Playgroud)

MPFR

mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install
Run Code Online (Sandbox Code Playgroud)

MPC

mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install
Run Code Online (Sandbox Code Playgroud)

ISL

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
make -j $THREADS && make install
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这真的很好,谢谢你的写作. (4认同)

vpt*_*ptr 6

使用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
Run Code Online (Sandbox Code Playgroud)

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


Jun*_*iar 6

尝试安装 GCC 依赖项(包括GMP、MPFRMPC)后。我遇到了额外的安装要求、错误和丢失的文件;例如MPFR安装所需的gmp.h头文件。在此过程中您会遇到许多问题。但是,有一种更简单的方法可以通过自动链接来构建和安装GCC-X.0.0更高版本。

选项一。

为了省去使用 make 构建、make install 和链接动态库的麻烦,只需:

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

  • 将 gcc-X-000.tar.gz 文件提取到位置 /somepath/。

  • 提取 .tar.gz 文件后,运行位于 /somepath/ 或源目录中的./contrib/download_precessions脚本。

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

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

选项二。

  • 使用操作系统包管理系统将支持库安装在标准系统位置。对于基于 Debian 的系统(包括 Ubuntu),安装libgmp-dev、libmpfr-devlibmpc-dev软件包。对于基于 RPM 的系统(包括 Fedora 和 SUSE),安装gmp-devellibmpc-devel( SUSE 上的mpc-devel)软件包。
  • 此选项将在标准系统目录中安装库和头文件,在构建 GCC 时将自动找到它们。
  • 这是操作系统包安装管理的优势,当您调用“sudo apt-get install libgmp-dev”“sudo apt-get install libmpfr-dev”时,安装和链接会为您完成。此外,您不必使用Make、Make install./configure 构建支持库。另外,该过程需要几分钟才能完成所有过程。
  • 现在您可以继续进行 GCC 安装。

配置:

This is the GCC config Process, with gcc-X-000.tar.gz 
Run Code Online (Sandbox Code Playgroud)

问题:

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
Run Code Online (Sandbox Code Playgroud)

注意:

--enable-语言,例如 c++ 或 c。

--禁用-multilib ; 根据您的系统和操作系统禁用 multilib,系统将提示您有关 multilib 的信息以继续。

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

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