簡體   English   中英

如何使用GMP,MPFR,MPC,ELF逐個安裝GCC,無需共享庫?

[英]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,可以在不使用任何共享庫的情況下在我的系統中移動,而無需創建任何共享庫。
  • 這就是GCC所說的“困難之路”,不建議普通用戶使用。

GCC取決於:

  • GMP:GNU多精度算術庫
  • MPFR:GNU多精度浮點舍入庫
  • MPC:GNU多精度C庫
  • ELF:可執行和可鏈接格式庫
  • PPL:Parma Polyhedra庫(可選,用於內存優化)

簡單的方法

如果您是典型的開發人員,可以使用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

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

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是用

  • 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 "\"\$$#\""; }

以下每個命令都將在剛剛下載的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

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

使用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,MPFRMPC。 我遇到了額外的安裝要求,錯誤和丟失的文件; 比如MPFR安裝所需的gmp.h頭文件。 您將在此過程中遇到許多問題。 但是,通過自動鏈接可以更輕松地構建和安裝GCC-X.0.0更高版本。

選項一。

為了省去使用make構建的問題,make install和鏈接動態庫,簡單地說:

  • 下載您的GCC-X.0.0 -version(最新版本來自: https ://gcc.gnu.org/)
  • 將gcc-X-000.tar.gz文件解壓縮到某個位置/ somepath /。
  • 獲得Extracted .tar.gz文件后,運行位於/ somepath /或源目錄的./contrib/download_prerequisites腳本。
  • 此腳本將下載支持庫,包括: GMP,MPFRMPC ,並將為您創建一個Symlinks ,它將自動 構建所有gcc依賴項,作為gcc安裝過程的一部分。

    無需通過發出Make,Make Install或運行./configure文件或添加諸如--with-gmp = / gmp_path / ... / .....之類的鏈接來構建和鏈接下載到/ somepath /的支持庫。 , - with-mpfr = / mpfr_path / ... / ...因為這是在運行創建符號鏈接的腳本時完成的。

選項二。

  • 使用OS軟件包管理系統在標准系統位置安裝支持庫。 對於基於Debian的系統,包括Ubuntu,安裝libgmp-dev,libmpfr-devlibmpc-dev軟件包。 對於包括Fedora和SUSE在內的基於RPM的系統,請安裝gmp-devellibmpc-devel (在SUSE上使用mpc-devel )軟件包。
  • 此選項將庫和頭文件安裝在標准系統目錄中,在構建GCC時將自動找到它們。
  • 當您調用“sudo apt-get install libgmp-dev”“sudo apt-get install libmpfr-dev”安裝並完成鏈接時,這是OS Package安裝管理的優勢。 此外,您不必使用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

注意:

- 啟用語言 ,如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM