如何在没有共享库的情况下使用 GMP、MPFR、MPC、ELF 逐个安装 GCC?
Posted
技术标签:
【中文标题】如何在没有共享库的情况下使用 GMP、MPFR、MPC、ELF 逐个安装 GCC?【英文标题】:How to install GCC piece by piece with GMP, MPFR, MPC, ELF, without shared libraries? 【发布时间】:2012-03-16 01:30:17 【问题描述】:如何使用当前版本逐个安装 GCC(GNU 编译器集合), 使用正确版本的依赖,不使用包管理器(如 yum、rpm、apt、dpkg),不使用共享库?
典型的开发人员可能希望以典型的方式安装 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 多面体库(可选,用于内存优化)【问题讨论】:
【参考方案1】:简单的方法
如果您是一名典型的开发人员,您可以使用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 代表可执行和可链接格式。该库提供与架构无关的大小和字节序支持。
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 并阅读有关标志here
/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 in cmets)
您可以从 gcc 源目录运行 ./contrib/download_prerequisites。 (感谢reddit上的N7P)
【讨论】:
仅供参考,请务必为新的 GCC 4.6.3 更新上述版本号(或执行此操作时的任何当前版本) 您可以从 gcc 源目录运行 ./contrib/download_prerequisites。此评论感谢 Reddit 上的 N7P。 不,引导不依赖于它。使用 --disable-shared 构建 GMP、MPFR 和 MPC 是有意义的,但不适用于 GCC 本身(并且使用 download_prerequisites 脚本意味着您无论如何都不需要手动构建 GMP、MPFR 和 MPC)。构建 GCC 总是默认构建静态库和共享库,--disable-shared 只是意味着你没有共享库,这对大多数人来说是错误的选择。--disable-shared
对大多数人来说是错误的,--disable-bootstrap
可能会加快构建速度,但可能会导致构建失败,具体取决于现有的 gcc 版本,--enable-libgomp
无论如何默认启用,--enable-lto
默认启用,--enable-thread-safe
不是有效选项,--enable-threads=posix
在某些平台上默认启用,在其他平台上无效,--enable-tls
默认启用,...基本上这些说明很差
您可以使用 Linuxbrew 在您的主目录中使用brew install gcc
安装 gcc(以及可选的 glibc)。见linuxbrew.sh【参考方案2】:
接受的答案使得它远比必要的复杂,并且并非对所有版本都是正确的。使用--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
【讨论】:
不,没有遗漏步骤 @user2023370,GCC 当然知道如何找到它自己的所有头文件和库。您需要设置 LD_LIBRARY_PATH 来告诉动态链接器如何查找库(因为当您运行可执行的 GCC 时不再涉及),请参阅gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths @einpoklum,那么你的“类似这样的东西”就不一样了。上述步骤有效。他们定期为我工作,使用所有版本的 GCC。他们为数百人工作。 为了将来参考,这对我来说适用于 gcc-5.4.0。唯一没有提到的是,我必须先unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
,然后再按照这里的建议:***.com/questions/12255058/…
这对我来说适用于 gcc 6.2.0,绝对应该是公认的答案! (它适用于操作系统/版本等)【参考方案3】:
我在集群上工作。只有主节点连接到 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
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
【讨论】:
这太复杂了,my answer 中的步骤也构建了一个静态链接的 GCC,无需 root 访问权限,您无需设置LD_LIBRARY_PATH
即可使用生成的 GCC。跨度>
这也适用于与“定义明确”的路径中安装的任何内容发生冲突的情况(即标准程序完全无法工作的情况)。截至 2017 年 6 月 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【参考方案4】:
除了我必须手动下载 gmp 和 mpfr 并创建软链接(gcc 4.4.2 发行版可能没有“download_prerequisites”)之外,使用了上面 Jonathan 提到的内容
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 ***目录中创建了指向它的软链接
【讨论】:
【参考方案5】:在尝试安装 GCC 依赖项(包括 GMP、MPFR 和 MPC)后。我遇到了额外的安装要求、错误和丢失文件;如 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、MPFR 和 MPC 并将为您创建一个 符号链接,这将 构建所有 gcc 依赖项自动作为 gcc 安装过程的一部分。
无需通过发出 Make、Make Install 或运行 ./configure 文件或添加以下链接来构建和链接已下载到 /somepath/ 的支持库 - -with-gmp=/gmp_path/.../....., --with-mpfr=/mpfr_path/.../... 因为这是在您运行创建符号链接的脚本时完成的em>。
选项二。
使用您的操作系统包管理系统在标准系统位置安装支持库。对于基于 Debian 的系统,包括 Ubuntu,安装 libgmp-dev、libmpfr-dev 和 libmpc-dev 软件包。对于基于 RPM 的系统,包括 Fedora 和 SUSE,请安装 gmp-devel、 和 libmpc-devel( mpc-devel 在 SUSE 上)包。 此选项会将库和头文件安装在标准系统目录中,在构建 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.
【讨论】:
【参考方案6】:我遵循了 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
【讨论】:
为了使用编译器而必须更新 LD_LIBRARY_PATH 是愚蠢的。如果您使用 ***.com/a/10662297/981959 代替,则没有必要。以上是关于如何在没有共享库的情况下使用 GMP、MPFR、MPC、ELF 逐个安装 GCC?的主要内容,如果未能解决你的问题,请参考以下文章
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+. 解决
python2.7删了,yum不能用,装python3.7时需要装gcc,装gcc时要依赖mpc、mpfr、gmp,装gmp依赖CC怎么搞?