如何安装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