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


115

如何使用当前版本,
正确的依赖版本,不使用软件包管理器(如yum,rpm,apt,dpkg)以及不使用共享库来逐步安装GCC(GNU编译器集合)?

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

我的问题是如何在没有共享库的情况下逐步安装GCC。

  • 我想要一个完全独立的GCC,可以在我的系统中移动而不使用任何共享库,也无需创建任何共享库。
  • 这就是GCC所谓的“困难之路”,不建议一般用户使用。

GCC取决于:

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

Answers:


123

简单的方法

如果您是典型的开发人员,则可以使用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基础架构:

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

将下载文件放在临时目录中(您可以使用所需的任何目录)。

/opt/downloads

在与downloads目录或其子目录不同的temp目录中构建基础结构:

/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代表可执行和可链接格式。该库提供与体系结构无关的大小和字节序支持。

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

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

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

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

该页面非常适合GCC安装信息,如何构建它,各种标志以及更多内容:

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

更新

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

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


2
仅供参考,请务必为新的GCC 4.6.3(或执行此操作时的当前版本)更新上述版本号
joelparkerhenderson 2012年

12
您可以从gcc源目录运行./contrib/download_prerequisites。此评论感谢Reddit上的N7P。
joelparkerhenderson 2012年

3
不,引导程序不依赖于此。可以使用--disable-shared来构建GMP,MPFR和MPC,但不适用于GCC本身(使用download_prerequisites脚本意味着您无论如何都不需要手动构建GMP,MPFR和MPC)。默认情况下,构建GCC始终会构建静态库共享库,--disable-shared仅表示您没有共享库,这对于大多数人来说是错误的选择。
乔纳森·威克利

8
--disable-shared对大多数人来说是错误的,--disable-bootstrap可能会加快构建速度,但可能会导致构建失败,具体取决于现有的gcc版本,--enable-libgomp无论如何默认--enable-lto启用,默认启用,--enable-thread-safe不是有效的选项,--enable-threads=posix默认情况下在某些平台上启用,在其他平台上无效,--enable-tls默认情况下启用... ...基本上,这些说明非常糟糕
Jonathan Wakely 2012年

1
您可以使用Linuxbrew通过在主目录中安装gcc(和可选的glibc)brew install gcc。参见linuxbrew.sh
Shaun Jackman

118

接受的答案使它远远超过必要的复杂,并不适用于所有版本的正确。用GCC构建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

(但是无论如何,请阅读上面的链接,其中包含有用的信息。)

显然,Ubuntu上的某些人在其环境中设置了很多废话,这会干扰GCC的构建过程,因此需要首先删除该废话:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

2
不,没有遗漏的步骤
Jonathan Wakely 2013年

2
@ user2023370,当然,GCC知道如何找到自己的所有标头和库。您需要设置LD_LIBRARY_PATH来告诉动态链接器如何查找库(因为不再运行可执行GCC时),请参阅gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

2
@einpoklum,那么您的“类似这样的东西”就不一样了。以上步骤起作用。他们会定期为我使用所有版本的GCC。他们为数百人服务。
乔纳森·威克利

3
供以后参考,这对我适用于gcc-5.4.0。唯一没有提到的是,我必须unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH按照此处的建议进行其他操作:stackoverflow.com/questions/12255058/…–
Cantfindname

4
这适用于我与gcc 6.2.0,绝对应该是公认的答案!(它适用于各种操作系统/版本等)
David Doria

25

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

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

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

我把所有东西都建好了

PREFIX=$HOME/cmp/soft/sft

因为make我用

THREADS=8

下面,gcc内置了

  • GMP
  • MPFR
  • MPC
  • ISL
  • 克鲁格

可以从这里获取最新的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

克鲁格

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

海湾合作委员会

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
这是不必要的复杂,我的答案中的步骤还可以构建没有根访问权限的静态链接的GCC,并且您无需设置LD_LIBRARY_PATH为使用生成的GCC。
Jonathan Wakely 2015年

这也适用于与“定义明确的”路径中安装的内容存在冲突的情况(即,标准过程完全无法执行的情况)。截至2017-06-19的最新版本:gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn

7

使用了上面乔纳森提到的内容,除了我必须手动下载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”一起使用给我“配置:错误:无法计算目标文件的后缀:无法编译”。因此,我下载了gmp和mpfr的src,然后从gcc src top leve dir中创建了到它的软链接


2

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

选项一。

为了避免使用make进行构建的麻烦,只需执行make install和Linking动态库,即可:

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

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

  • 提取.tar.gz文件后,运行/ somepath /或源目录上的./contrib/download_prerequisites脚本。

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

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

选项二。

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

组态:

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

注意:

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

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

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

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


1

我遵循了joelparkerhenderson接受的最高答案。这是通过Internet在* 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


仅使用编译器就必须更新LD_LIBRARY_PATH是愚蠢的。如果您使用stackoverflow.com/a/10662297/981959,则没有必要。
Jonathan Wakely 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.