如何安装GMP,MPFR,MPC,ELF,没有共享库?

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

典型的开发人员可能希望以典型的方式安装GCC,使用你的软件包pipe理器(yum,rpm,apt,dpkg,port,brew等),或者按照这里的说明( http://gcc.gnu.org/wiki/安装GCC )。

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

  • 我想要一个完全独立的GCC,可以在我的系统中移动而不使用任何共享库,也不需要创build任何共享库。
  • 这就是GCC所说的“困难的方式”,不推荐给典型的用户。

GCC取决于:

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

简单的方法

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

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

艰难的路

海湾合作委员会说这里的答案是“困难的方式”,因为它build立一切一块一块,而不使用共享库。

GCC基础设施

获取GCC基础架构:

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

把下载放在一个临时目录(你可以使用任何你想要的目录)。

 /opt/downloads 

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

 /tmp/gcc 

使用这样的静态库来configuration基础架构:

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

–disable-shared标志可能值得仔细观察,这取决于你的需求。 我使用–disable-shared,因为我只是build立静态代码,我想确保我不build立任何共享代码。 我的需求是将驱动器的结果轻松移动到我的驱动器中,所以我需要所有的静态代码,而且我不需要任何共享代码。 如果您更喜欢共享代码,则省略–disable-shared标志。

版本

在此答案中运行任何命令时,请确保更新命令以使用符合您需要的当前GCC版本号。 这个答案中的命令是GCC 4.6.2。

请注意,GCC文档说:“虽然任何新版本的必需工具通常都能正常工作,但是对库的要求通常更严格,在某些情况下,新版本可能会有效,但使用logging的确切版本更为安全。

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

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 

在同一个挂载点的临时目录中构buildgcc。 (在/ tmp中构build它将触发交叉编译主机问题)

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

configure命令及其标志必须全部在一个命令行上(这个post仅仅因为网页的宽度而在不同的行上显示它们)。

注意:我们使用完整path进行configuration,不要设置库path环境variables。 我们select禁用引导并禁用共享库,因为我们不希望它们(典型的用户可能同时需要这两者),并且使用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 

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

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

更新

可以使用ppl库进行内存优化:请参阅bugseng.com/products/ppl/Download(感谢Paul的评论)

您可以从gcc源码目录运行./contrib/download_prerequisites。 (感谢reddit上的N7P)

被接受的答案使得它比必要的复杂得多,对所有版本都是不正确的。 使用--disable-shared构buildGCC通常是一个非常糟糕的主意。 有关更简单的方法,请参阅http://gcc.gnu.org/wiki/InstallingGCC

整个过程不应该比这更难(用你想要构build的版本replace4.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构build过程,他们需要首先删除:

 unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH 

我在一个集群上工作。 只有主节点连接到Internet。 节点上的软件过时,通常不会维护。 我没有root权限。 我有两个select:

  • build立我需要的静态软件(计算软件包); 要么
  • build立静态编译器。

我select了第二个,并build立了gcc,g ++和gfortran。

我build立了一切

 PREFIX=$HOME/cmp/soft/sft 

make我使用

 THREADS=8 

下面,gcc是用

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

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

依赖关系在这里find: 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 

使用了上面提到的Jonathan,除了我必须手动下载gmp和mpfr并创build软链接(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里创build了软链接

我遵循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