[英]How to install GCC piece by piece with GMP, MPFR, MPC, ELF, without shared libraries?
如何使用当前版本逐个安装GCC(GNU编译器集合),
使用正确版本的依赖项,而不是使用包管理器(如yum,rpm,apt,dpkg),而不使用共享库?
典型的开发人员可能希望以典型的方式安装GCC,使用您的包管理器(yum,rpm,apt,dpkg,port,brew等)或按照此处的说明进行操作( http://gcc.gnu.org/wiki/ InstallingGCC )。
我的问题是如何一块一块地安装GCC,没有共享库。
GCC取决于:
如果您是典型的开发人员,可以使用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是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是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是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代表可执行和可链接格式。 该库提供与体系结构无关的大小和endian支持。
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
在同一个挂载点的scratch目录中构建gcc。 (在/ tmp中构建它会触发交叉编译主机问题)
mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch
configure命令及其标志必须全部在一个命令行上(由于网页宽度,此帖子在单独的行中显示它们)。
注意:我们使用完整路径进行配置,不要设置库路径环境变量。 我们选择禁用引导程序并禁用共享库,因为我们不希望它们(典型用户可能想要两者),并使用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。 (感谢NdP on reddit)
接受答案使它远远超过必要的复杂,并不适用于所有版本的正确。 使用--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
我在一个集群上工作。 只有主节点连接到Internet。 节点上的软件已过时,通常无法维护。 我没有root访问权限。 我有两个选择:
我选择了第二个并构建了gcc,g ++和gfortran。
我把一切都建成了
PREFIX=$HOME/cmp/soft/sft
和make
我用
THREADS=8
下面,gcc是用
可以从这里获得最新的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的目录中发布。
mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install
mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install
mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install
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
使用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:无法计算目标文件的后缀:无法编译”。 因此我下载了gmp和mpfr的srcs,然后从gcc src top leve dir中创建了它的软链接
尝试安装GCC依赖项后,包括GMP,MPFR和MPC。 我遇到了额外的安装要求,错误和丢失的文件; 比如MPFR安装所需的gmp.h头文件。 您将在此过程中遇到许多问题。 但是,通过自动链接可以更轻松地构建和安装GCC-X.0.0或更高版本。
选项一。
为了省去使用make构建的问题,make install和链接动态库,简单地说:
此脚本将下载支持库,包括: GMP,MPFR和MPC ,并将为您创建一个Symlinks ,它将自动 构建所有gcc依赖项,作为gcc安装过程的一部分。
无需通过发出Make,Make Install或运行./configure文件或添加诸如--with-gmp = / gmp_path / ... / .....之类的链接来构建和链接下载到/ somepath /的支持库。 , - with-mpfr = / mpfr_path / ... / ...因为这是在运行创建符号链接的脚本时完成的。
选项二。
组态:
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
注意:
- 启用语言 ,如c ++或c。
--disable-multilib ; 根据您的系统和操作系统禁用multilib,系统将提示您继续执行multilib。
制作需要很长时间才能完成。 但是,您可以发出选项-j #no_pro。 这将根据PC或Mac上的处理器数量并行运行Make并行。
有关如何执行此过程的详细信息,请访问: https : //gcc.gnu.org/wiki/InstallingGCC 。
我跟随了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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.