共有ライブラリなしで、GMP、MPFR、MPC、ELFを使用してGCCを1つずつインストールする方法


115

現在のバージョンを使用して、GCC(GNU Compiler Collection)を少しずつインストールする方法
使用し、正しいバージョンの依存関係を使用し、パッケージマネージャー(yum、rpm、apt、dpkgなど)を使用せず、共有ライブラリを使用せずに、。

一般的な開発者は、GCCを一般的な方法でインストールするか、パッケージマネージャー(yum、rpm、apt、dpkg、port、brewなど)を使用するか、ここ(http://gcc.gnu.org/wiki/)の指示に従います。 GCCのインストール)。

私の質問は、共有ライブラリなしで、GCCを少しずつインストールする方法です。

  • 共有ライブラリを使用したり、共有ライブラリを作成したりせずにシステム内を移動できる、完全に独立したGCCが必要です。
  • これはGCCが「難しい方法」と呼んでいるものであり、一般的なユーザーにはお勧めできません。

GCCは以下に依存します:

  • GMP:GNU倍精度演算ライブラリ
  • MPFR:GNU倍精度浮動小数点丸めライブラリ
  • MPC:GNU倍精度Cライブラリ
  • ELF:実行可能およびリンク可能なフォーマットライブラリ
  • PPL:Parma Polyhedra Library(オプション、メモリ最適化用)

回答:


123

簡単な方法

あなたが典型的な開発者なら、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は、ここでの答えは「困難な方法」であると言います。これは、すべてを1つずつ構築し、共有ライブラリを使用しないためです。

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の倍精度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

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コマンドとそのフラグはすべて1つのコマンドラインにある必要があります(この投稿では、Webページの幅のために、それらを別々の行に示しています)。

注:設定にはフルパスを使用し、ライブラリパス環境変数は設定しません。ブートストラップを無効にして共有ライブラリを無効にすることを選択します(一般的なユーザーは両方を必要とする場合があります)。また、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を実行できます。(redditのN7Pに感謝)


2
参考までに、新しいGCC 4.6.3(またはこれを実行しているときの最新のもの)については、上記のバージョン番号を必ず更新してください
joelparkerhenderson

12
gccソースディレクトリから./contrib/download_prerequisitesを実行できます。このコメントはRedditのN7Pに感謝します。
joelparkerhenderson 2012年

3
いいえ、ブートストラップはそれに依存していません。GMP、MPFR、およびMPCのビルドには--disable-sharedを使用することは意味がありますが、GCC自体には使用できません(そして、download_prerequisitesスクリプトを使用することで、GMP、MPFR、MPCを手動でビルドする必要がなくなります)。GCCをビルドする、デフォルトで常に静的ライブラリ共有ライブラリがビルドされます。--disable-sharedは、共有ライブラリを取得しないことを意味します。これは、ほとんどの人にとって間違った選択です。
ジョナサンウェイクリー

8
--disable-sharedほとんどの人にとっては間違って--disable-bootstrapおり、ビルドを高速化できますが、既存のgccバージョンによっては失敗する可能性があり--enable-libgompます。デフォルトで--enable-lto有効になっています。デフォルトで--enable-thread-safe有効です。有効なオプションで--enable-threads=posixはありません。一部のプラットフォームではデフォルトで有効ですが、他のプラットフォームでは無効です。 、--enable-tlsデフォルトで有効、...基本的にこれらの指示はかなり貧弱です
Jonathan Wakely

1
Linuxbrewを使用して、gcc(およびオプションでglibc)をホームディレクトリにでインストールできますbrew install gcclinuxbrew.shを
Shaun Jackman

118

受け入れ答えは、それが作るはるかに必要以上に複雑であり、すべてのバージョンのため正しくありません。--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

2
いいえ、足りないステップはありません
Jonathan Wakely

2
@ user2023370、GCCはもちろん、独自のヘッダーとライブラリをすべて見つける方法を知っています。LD_LIBRARY_PATHを設定して、ダイナミックリンカーにライブラリの検索方法を通知する必要があります(実行可能なGCCを実行するときに関与しなくなったため)。gcc.gnu.org/ onlinedocs / libstdc ++ / faq.html
Jonathan Wakelyを

2
@einpoklum、あなたの「このようなもの」は同じではありませんでした。上記の手順は機能します。GCCのすべてのバージョンで、彼らは私のために定期的に働いています。彼らは何百人もの人々のために働いています。
Jonathan Wakely、2015

3
将来の参考のために、これはgcc-5.4.0で私にとってはうまくいきました。言及されていない唯一のものは、私が持っていたということでしたunset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH。ここで示唆したように、他のすべての前にstackoverflow.com/questions/12255058/...
Cantfindname

4
これはgcc 6.2.0で私にとってはうまくいき、間違いなく受け入れられる答えになるはずです!(オペレーティングシステム/バージョンなどで機能します)
David Doria

25

クラスタで作業しています。マスターノードのみがインターネットに接続されています。ノード上のソフトウェアは古く、一般にメンテナンスされていません。rootアクセス権がありません。2つのオプションがあります。

  • 必要な静的ソフトウェア(計算パッケージ)をビルドします。または
  • 静的コンパイラを構築します。

私は2番目を選び、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のdirで発行されます。

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

1
これは不必要に複雑です。私の回答の手順で、静的にリンクされたGCCも構築されており、ルートアクセスはありません。設定する必要はありません。LD_LIBRARY_PATHれます。結果のGCCを使用する。
Jonathan Wakely、2015年

これは、「明確に定義された」パスにインストールされているものと競合する状況(つまり、標準手順が完全に機能しない場合)でも機能します。2017-06-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
7.1.0

7

上記の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:エラー:オブジェクトファイルのサフィックスを計算できません:コンパイルできません」と表示されました。したがって、gmpとmpfrのsrcをダウンロードし、gcc src top leve dir内からそれへのソフトリンクを作成しました


2

GMP、MPFRMPCなどのGCC依存関係をインストールしようとした後追加のインストール要件、エラー、ファイルの欠落に遭遇しました。MPFRのインストールに必要なgmp.hヘッダーファイルなど。このプロセスで遭遇する多くの問題があります。しかし、ビルドとインストールが簡単な方法はありGCC-x.0.0というか、それ以降のとバージョンが自動リンクは、

オプション1。

make、make install、ダイナミックライブラリのリンクを使用してビルドする手間を省くには、次のようにします。

  • GCC-X.0.0 -versionをダウンロードします(最新バージョンはhttps://gcc.gnu.org/から)

  • gcc-X-000.tar.gzファイルを場所/ somepath /に抽出します。

  • .tar.gzファイルを抽出したら、。/ contrib / download_prerequisitesを実行します、/ somepath /またはソースディレクトリにあるスクリプトを。

  • このスクリプトは、以下を含むサポートライブラリにダウンロードします:GMP、MPFRMPCをして作成するシンボリックリンクをされますよう、あなたのためBUILDすべてのgccの依存関係を自動的に gccのインストールプロセスの一部として。

    発行してに/ somepath /ダウンロードされたビルドとリンク・サポート・ライブラリする必要はありませんがメイクを、インストールしてくださいまたは実行中に./configureファイルをや、--with-GMP = / gmp_path / ... /としてリンクを追加..... 、--with-mpfr = / mpfr_path / ... / ...これは、シンボリックリンクを作成するスクリプトを実行したときに行われたためです。

オプション2。

  • OSパッケージ管理システムを使用して、標準システムの場所にサポートライブラリをインストールします。Ubuntuを含むDebianベースのシステムの場合は、libgmp-dev、libmpfr-dev、およびlibmpc-devパッケージをインストールします。FedoraとSUSEを含むRPMベースのシステムの場合、gmp-devel、 およびlibmpc-develmpc-devel SUSEでは)パッケージをます。
  • このオプションは、ライブラリとヘッダーファイルを標準システムディレクトリにインストールし、GCCのビルド時に自動的に検出されます。
  • これは、「sudo apt-get install libgmp-dev」または「sudo apt-get install libmpfr-dev」インストールを呼び出し、リンクが行われる場合のOSパッケージインストール管理の利点です。さらに、Make、Make install、またはMakeを使用してサポートライブラリをビルドする必要はありません。。 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 ; システムとOSに基づいてmultilibを無効にすると、続行するためにmultilibについてプロンプトが表示されます。

メイクが完了するまでには長い時間がかかります。ただし、オプション-j #no_proを発行できます。これにより、PCまたはMacのプロセッサの数に基づいて、Makeが同時に並行して実行されます。

このプロセスの実行方法の詳細については、https//gcc.gnu.org/wiki/InstallingGCCにアクセスしてください


1

私はjoelparkerhendersonによってトップの受け入れられた答えに従いました。これは、インターネット経由で* NIXシステムにインストールするために見つけることができる最良の答えです。

後世のために、「インストールエラー:オブジェクトファイルのサフィックスを計算できません:コンパイルできません」などのエラーが発生した場合は、追加したいと思います。

次に、LD_LIBRBARY_PATHを/ tmp / gcc / libで更新します(コンテキストについては、joelparkerhendersonの完全な回答を参照してください)

/ tmp / gcc / libには、必要なすべてのmpfr / mpc / gmpが含まれているため、LD_LIBRARY_PATHに追加しない限り、ファイルとランタイムリンカーはそれらを見つけることができません。また、LD_LIBRARY_PATHをエクスポートすることを忘れないでください;)。ここでより多くのコンテキスト:https : //gcc.gnu.org/wiki/FAQ#configure_suffix


コンパイラを使用するためだけにLD_LIBRARY_PATHを更新する必要はありません。代わりにstackoverflow.com/a/10662297/981959を使用する場合、これは必要ありません。
Jonathan Wakely、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.