首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用GMP、MPFR、MPC、ELF等分片安装GCC,没有共享库?

如何用GMP、MPFR、MPC、ELF等分片安装GCC,没有共享库?
EN

Stack Overflow用户
提问于 2012-02-26 11:53:36
回答 6查看 116.3K关注 0票数 122

如何使用当前版本,分块安装GCC ( GNU编译器集),

使用正确版本的依赖项,不使用包管理器(如yum,rpm,apt,dpkg),不使用共享库?

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

我的问题是,如何在没有共享库的情况下,一块一块地安装GCC。

我想要一个完全独立的GCC,它可以在不使用任何共享库的情况下在我的系统中移动,并且不创建任何共享的libraries.

  • This,这是
  • 所说的“困难的方式”,不建议普通用户使用。

GCC依赖于:

  • GMP: GNU多精度算术库
  • MPFR: GNU多精度浮点舍入库
  • MPC: GNU多精度C库
  • ELF:可执行和可链接格式库
  • PPL: Parma多面体库(可选,用于memory memory
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-02-26 12:01:55

简单的方法

如果您是一名典型的开发人员,您可以使用http://gcc.gnu.org/wiki/InstallingGCC或系统包管理器中的说明,以简单的方式进行安装,例如:

代码语言:javascript
复制
apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

艰难的道路

GCC说,这里的答案是“艰难的方式”,因为它是一块一块地构建一切,而不是使用共享库。

GCC基础设施

获取GCC基础架构:

代码语言:javascript
复制
ftp://gcc.gnu.org/pub/gcc/infrastructure/

将下载文件放在一个临时目录中(你可以使用任何你想要的目录)。

代码语言:javascript
复制
/opt/downloads

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

代码语言:javascript
复制
/tmp/gcc

使用静态库配置基础设施,如下所示:

代码语言:javascript
复制
./configure --disable-shared --enable-static --prefix=/tmp/gcc

根据您的需要,--disable-shared标志可能值得仔细查看。我使用--disable-shared是因为我只构建静态代码,并且我希望确保不构建任何共享代码。我需要的是轻松地在我的驱动器之间移动产生的GCC,所以我想要所有的静态代码,我不想要任何共享代码。如果您更喜欢共享代码,那么可以省略--disable-shared标志。

版本

当您运行本答案中的任何命令时,请确保更新命令以使用符合您需求的当前GCC版本号。此答案中的命令是针对GCC 4.6.2的。

请注意,GCC的文档中说:“尽管所需工具的任何足够新的版本通常都可以工作,但库要求通常更严格。在某些情况下,较新的版本可能可以工作,但使用文档中记录的确切版本会更安全。”

GMP

GMP是GNU多精度算术库。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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代表可执行和可链接格式。该库提供独立于体系结构的大小和字节顺序支持。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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中构建它会触发交叉编译主机问题)

代码语言:javascript
复制
mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch

configure命令和它的标志必须在一个命令行上(由于网页宽度的原因,这篇文章在单独的行上显示它们)。

注意:我们使用完整路径来配置,并且不设置库路径环境变量。我们选择禁用bootstrap和共享库,因为我们不需要它们(典型用户可能两者都想要),并选择使用POSIX线程和to标志,因为我们需要它们(典型用户可能希望使用其他线程或跳过默认标志)。YMMV,并阅读有关标志here

代码语言:javascript
复制
/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 )

票数 135
EN

Stack Overflow用户

发布于 2012-05-19 12:28:13

公认的答案是far比必要的更复杂,并且并不是对所有版本都正确。用--disable-shared构建GCC通常是一个非常糟糕的想法。有关更简单的方法,请参阅http://gcc.gnu.org/wiki/InstallingGCC

整个过程应该不会比这更困难(用您想要构建的版本替换4.6.2 ):

代码语言:javascript
复制
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的构建过程,他们需要首先删除这些垃圾:

代码语言:javascript
复制
unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
票数 125
EN

Stack Overflow用户

发布于 2014-02-27 01:02:59

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

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

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

我把所有的东西都建在

代码语言:javascript
复制
PREFIX=$HOME/cmp/soft/sft

对于make,我使用了

代码语言:javascript
复制
THREADS=8

下面,gcc是用

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

你可以从这里获得最新的gcc:ftp://gcc.gnu.org/pub/gcc/releases

依赖关系可在以下位置找到:ftp://gcc.gnu.org/pub/gcc/infrastructure

依赖关系

我使用以下脚本获取依赖项:

代码语言:javascript
复制
#!/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函数的用法:

代码语言:javascript
复制
mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

下面的每个命令都将在刚刚下载的lib目录中发出。

GMP

代码语言:javascript
复制
mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install

MPFR

代码语言:javascript
复制
mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install

MPC

代码语言:javascript
复制
mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install

ISL

代码语言:javascript
复制
mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
make -j $THREADS && make install

CLOOG

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9450394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档