如何逐步安装GCC,并包含GMP、MPFR、MPC、ELF,但不使用共享库?

129

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

通常开发者想要以Typical方式安装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库(可选,用于内存优化)
7个回答

145

简单方法

如果您是一名典型的开发者,可以按照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代表可执行和可链接格式。该库提供了与体系结构无关的大小和字节序支持。

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

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

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

配置命令及其标志必须在一条命令行上(本帖子将它们显示在不同的行上只是因为网页宽度限制)。

注意:我们使用完整路径来运行configure,不设置库路径环境变量。我们选择禁用bootstrap和禁用共享库,因为我们不需要它们(典型用户可能都需要它们)。同时,我们选择使用posix线程并使用默认标志,因为我们需要它们(典型用户可能希望使用其他线程或跳过默认标志)。你的情况可能有所不同,请在这里阅读相关标志信息

/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)


3
请确保更新上述版本号,以适应新的GCC 4.6.3(或者您执行此操作时的任何最新版本)。 - joelparkerhenderson
15
你可以在 GCC 源代码目录中运行 ./contrib/download_prerequisites。这条评论感谢 Reddit 上的 N7P。 - joelparkerhenderson
4
不,引导过程不依赖于它。构建GMP、MPFR和MPC时使用--disable-shared是有意义的,但构建GCC本身时不需要这样做(而且使用download_prerequisites脚本意味着您无需手动构建GMP、MPFR和MPC)。构建GCC始终默认构建静态库共享库,--disable-shared只意味着您不会得到共享库,这对大多数人来说是错误的选择。 - Jonathan Wakely
9
对于大多数人来说,使用 --disable-shared 是错误的;--disable-bootstrap 可能会加快构建速度,但根据现有的 gcc 版本可能导致构建失败;--enable-libgomp 默认已启用;--enable-lto 也默认已启用;--enable-thread-safe 不是有效选项;在某些平台上默认启用 --enable-threads=posix,但在其他平台上则无效;--enable-tls 默认已启用。总的来说,这些指令相当糟糕。 - Jonathan Wakely
2
谢谢Jonathan,这是我最好的猜测,用它们来构建一个完全可移动的GCC,而不需要任何共享库。你能建议一下你会使用哪些具体的标志吗? - joelparkerhenderson
显示剩余13条评论

133

被采纳的答案使得事情变得过于复杂,而且并非适用于所有版本。使用--disable-shared参数构建GCC通常是一个非常糟糕的主意。请查看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
2
@user2023370,当然,GCC知道如何找到所有自己的头文件和库。你需要设置LD_LIBRARY_PATH来告诉动态链接器如何找到这些库(因为当你运行一个可执行文件时,GCC不再参与),请参见https://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths。 - Jonathan Wakely
2
@einpoklum,那么你的“类似这样”的方法并不一样。上述步骤是有效的。它们经常对我有效,适用于所有版本的GCC。它们也适用于数百人。 - Jonathan Wakely
4
供以后参考,对于gcc-5.4.0,这对我有效。唯一未提及的是,我必须在执行任何其他操作之前按照此处建议 unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH。详情请参见:https://dev59.com/i2ct5IYBdhLWcg3wNq6v - Cantfindname
4
这个方法对我在gcc 6.2.0上可行,绝对应该被采纳为答案!(它可以跨多种操作系统/版本等工作。) - David Doria
显示剩余17条评论

27

我在一个集群上工作。只有主节点连接到互联网。节点上的软件已经过时,通常也没有维护。我没有 root 访问权限。我有两个选择:

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

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

我在以下位置构建了所有内容:

PREFIX=$HOME/cmp/soft/sft

对于make,我使用了

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 "\"\$$#\""; }

每个下面的命令都需要在刚下载的库的目录中执行。

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
这个过程非常复杂,而且我在我的回答中提供的步骤可以构建一个静态链接的GCC,无需root访问权限,并且您不需要设置LD_LIBRARY_PATH来使用生成的GCC。 - Jonathan Wakely
这也适用于在“明确定义”的路径中安装的任何内容存在冲突的情况(即,在标准过程无法正常工作的情况下)。截至2017-06-19的最新版本:gmp-6.1.2mpfr-3.1.5mpc-1.0.3isl-0.16.1cloog-0.18.4gcc-7.1.0 - Michael Goldshteyn

7

除了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: cannot compute suffix of object files: cannot compile”。因此,我下载了gmp和mpfr的源代码,然后从gcc源代码的顶级目录创建了软链接。


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_prerequisites脚本。

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

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

选项二。

  • 使用您的操作系统包管理系统,在标准系统位置安装支持库。对于基于Debian的系统,包括Ubuntu,请安装libgmp-dev、libmpfr-devlibmpc-dev软件包。对于基于RPM的系统,包括Fedora和SUSE,请安装gmp-devellibmpc-devel (SUSE上为mpc-devel)软件包。
  • 此选项将在标准系统目录中安装库和头文件,在构建GCC时会自动找到它们。
  • 这是OS Package Installation Management的优势,当您调用"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 

问题:

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

NB:

--enable-languages 表示启用编程语言,如c++或c。

--disable-multilib; 禁用多库(multilib)基于您的系统和操作系统,您将收到有关multilib的提示以进行后续操作。

Make 命令需要很长时间才能完成。然而,您可以使用选项-j #no_pro。这将根据计算机或Mac上的处理器数量并行运行Make。

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


1

我按照joelparkerhenderson的最佳答案进行了操作。这是我在互联网上找到的在*NIX系统上安装的最佳答案。

为了后人,我想补充一下,如果你遇到如下错误:

"install error: cannot compute suffix of object files: cannot compile"

那么请更新LD_LIBRBARY_PATH为/tmp/gcc/lib(有关详细信息,请参见joelparkerhenderson的完整答案)

/tmp/gcc/lib包含所有所需的mpfr/mpc/gmp so文件,运行时链接器无法找到它们,除非您将它们添加到LD_LIBRARY_PATH中。还要记得导出LD_LIBRARY_PATH ;)。更多上下文信息请参见:https://gcc.gnu.org/wiki/FAQ#configure_suffix


不得不更新LD_LIBRARY_PATH才能使用编译器是愚蠢的。如果你使用https://dev59.com/Tmox5IYBdhLWcg3wFAY1#10662297,那么这是不必要的。 - Jonathan Wakely

0

适用于GCC-13.2.0最新版本。

适用于最新的基于RPM的(Red-hat、Fedora、Rocky-Linux或CentOS)

安装sudo dnf install libgmp-dev libmpfr-dev libmpc-devel软件包。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接