122

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

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

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

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

GCC 取决于:

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

6 回答 6

135

简单的方法

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

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

/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

配置命令及其标志必须全部在一个命令行上(这篇文章将它们显示在不同的行中,只是因为网页宽度)。

注意:我们使用全路径配置,不设置库路径环境变量。我们选择禁用引导程序和禁用共享库,因为我们不想要它们(典型用户可能想要两者),并使用 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)

于 2012-02-26T04:01:55.010 回答
125

接受的答案使其必要的复杂得多,并且并非对所有版本都正确。构建 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
于 2012-05-19T04:28:13.253 回答
26

我在一个集群上工作。只有主节点连接到 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
于 2014-02-26T17:02:58.950 回答
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”给了我“配置:错误:无法计算目标文件的后缀:无法编译”。因此,我下载了 gmp 和 mpfr 的 src,然后从 gcc src top leve dir 中创建了指向它的软链接

于 2012-11-16T20:02:54.880 回答
3

在尝试安装 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/.../..... 之类的链接来构建和链接已下载到 /somepath/ 的支持库, --with-mpfr=/mpfr_path/.../... 因为这是在您运行创建符号链接的脚本时完成的。

选项二。

  • 使用您的 OS 包管理系统在标准系统位置安装支持库。对于基于 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”安装并为您完成链接时,这是 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-languages,例如 c++ 或 c。

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

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

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

于 2018-04-24T20:46:44.243 回答
1

我遵循了 joelparkerhenderson 接受的最高答案。这是我能找到的通过互联网在 *NIX 系统上安装的最佳答案。

对于后代,我想补充一点,如果您收到类似“安装错误:无法计算目标文件的后缀:无法编译”的错误

然后使用 /tmp/gcc/lib 更新您的 LD_LIBRBARY_PATH (有关上下文,请参阅 joelparkerhenderson 的完整答案)

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

于 2015-08-18T20:26:09.793 回答