如何安装GCC与GMP,MPFR,MPC,ELF一块一块,没有共享库?

uidvcgyl  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(119)

如何使用当前版本逐段安装GCC(GNU编译器集合),
使用正确版本的依赖项,不使用包管理器(如yum,rpm,apt,dpkg),不使用共享库?
典型的开发人员可能希望以典型的方式安装GCC,使用您的包管理器(yum,rpm,apt,dpkg,port,brew等)或按照这里的说明(http://gcc.gnu.org/wiki/InstallingGCC)。
我的问题是如何在没有共享库的情况下逐个安装GCC。

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

GCC取决于:

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

5sxhfpxr1#

The Easy Way

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

字符串

The Hard Way

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 Multiple Precision Arithmetic Library。

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 Multiple-precision 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


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

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


configure命令和它的标志必须都在一个命令行上(这篇文章只是因为网页宽度而将它们显示在单独的行上)。
注意事项:我们使用完整路径来配置而不设置库路径环境变量。我们选择禁用 Bootstrap 和禁用共享库,因为我们不需要它们(典型用户可能需要两者),并使用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的评论)
你可以从gcc源目录运行./contrib/download_premises。(感谢reddit上的N7 P)

vuv7lop3

vuv7lop32#

公认的答案使它比必要的复杂,并且不适用于所有版本。使用--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

字符串
(But请阅读上面的链接,无论如何,它包含有用的信息。
显然,Ubuntu上的一些人在他们的环境中设置了大量的垃圾,这些垃圾干扰了GCC的构建过程,他们需要首先删除这些垃圾:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

ezykj2lf

ezykj2lf3#

我在一个集群上工作。只有主节点连接到Internet。节点上的软件已经过时,通常不会维护。我没有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

d6kp6zgx

d6kp6zgx4#

使用上面Jonathan提到的方法,除了我必须手动下载gmp和mpfr并创建软链接(gcc 4.4.2发行版可能没有“download_premises”)

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的src,然后从gcc src顶层目录中创建了软链接

csbfibhn

csbfibhn5#

在尝试安装GCC依赖项,包括GMP,MPFRMPC。我遇到了额外的安装要求,错误和丢失的文件;例如MPFR安装所需的gmp. h头文件。在此过程中会遇到许多问题。但是,有一种更简单的方法来构建和安装GCC-X.0.0更高版本,并带有 * 自动链接 *。

备选案文一。

为了保存Build与make的麻烦,make install和Linking动态库,只需:

  • 下载您的GCC-X.0.0版本(最新版本来自:https://gcc.gnu.org/
  • 将gcc-X-000.tar.gz文件解压缩到位置/somepath/。
  • 一旦你有了Extracted. tar.gz文件,运行位于/somepath/或源目录的 *./contrib/download_premises * 脚本。
  • 此脚本将下载支持库,包括:GMP,MPFRMPC,并将为您创建一个 * 符号链接 *,该链接将作为gcc安装过程的一部分自动构建所有gcc依赖项。

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

**备选案文二。

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


注:

  • --enable-languages* 例如c++或c。
  • --disable-multilib*;根据您的系统和操作系统禁用multilib,您将被提示multilib继续。

Make将需要很长时间才能完成。但是,您可以发出选项-j #no_pro。这将根据PC或Mac上的处理器数量并行运行Make。
有关如何执行此过程的详细信息,您可以访问:https://gcc.gnu.org/wiki/InstallingGCC

5anewei6

5anewei66#

我遵循了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

qcbq4gxm

qcbq4gxm7#

适用于GCC-13.2.0最新版本。
对于基于最新RPM的应用程序(Red-hatFedoraRocky-LinuxCentOS
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

字符串

相关问题