GCC, paylaşımlı kütüphaneler olmadan GMP, MPFR, MPC, ELF ile parça parça nasıl kurulur?


115

GCC'yi (GNU Derleyici Koleksiyonu) parça parça, geçerli sürümü
kullanarak, bağımlılıkların doğru sürümlerini kullanarak, bir paket yöneticisi (yum, rpm, apt, dpkg gibi) kullanmadan ve paylaşılan kitaplıkları kullanmadan nasıl kurabilirim?

Tipik geliştiriciler muhtemelen GCC'yi tipik bir şekilde kurmak, paket yöneticinizi kullanmak (yum, rpm, apt, dpkg, port, brew, vb.) Veya buradaki talimatları ( http://gcc.gnu.org/wiki/ YüklemeGCC ).

Sorum, GCC'nin paylaşımlı kütüphaneler olmadan parça parça nasıl kurulacağı.

  • Herhangi bir paylaşılan kitaplık kullanmadan ve herhangi bir paylaşılan kitaplık oluşturmadan sistemimde hareket ettirilebilecek tamamen bağımsız bir GCC istiyorum.
  • Bu, GCC'nin "zor yol" olarak adlandırdığı şeydir ve tipik kullanıcılar için önerilmez.

GCC şunlara bağlıdır:

  • GMP: GNU Çok Duyarlı Aritmetik Kitaplığı
  • MPFR: GNU Çok hassas kayan noktalı yuvarlama kitaplığı
  • MPC: GNU Çok hassas C kitaplığı
  • ELF: Yürütülebilir ve Bağlanabilir Biçim kitaplığı
  • PPL: Parma Polyhedra Library (bellek optimizasyonları için isteğe bağlı)

Yanıtlar:


123

Kolay yol

Tipik bir geliştiriciyseniz, http://gcc.gnu.org/wiki/InstallingGCC adresindeki talimatları veya aşağıdaki gibi sistem paketi yöneticinizi kullanarak kolay yolu kurabilirsiniz :

apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

Zor yol

GCC, buradaki cevabın "zor yol" olduğunu söylüyor çünkü her şeyi parça parça oluşturuyor ve paylaşılan kitaplıkları kullanmıyor.

GCC altyapısı

GCC altyapısını edinin:

ftp://gcc.gnu.org/pub/gcc/infrastructure/

İndirmeleri geçici bir dizine koyun (istediğiniz dizini kullanabilirsiniz).

/opt/downloads

Altyapıyı, indirme dizininden veya alt dizinlerinden farklı bir geçici dizinde oluşturun:

/tmp/gcc

Statik kitaplıkları kullanarak altyapıyı şu şekilde yapılandırın:

./configure --disable-shared --enable-static --prefix=/tmp/gcc

--Disable-shared flag, ihtiyaçlarınıza bağlı olarak daha yakından incelenmeye değer olabilir. --Disable-shared kullanıyorum çünkü yalnızca statik kod oluşturuyorum ve herhangi bir paylaşılan kod oluşturmadığımdan emin olmak istiyorum. İhtiyacım, sonuçta ortaya çıkan GCC'yi sürücülerimde kolayca hareket ettirmek, bu nedenle tüm statik kodları istiyorum ve herhangi bir paylaşılan kod istemiyorum. Paylaşılan kodu tercih ediyorsanız, --disable-shared işaretini atlayın.

Sürümler

Bu yanıttaki komutlardan herhangi birini çalıştırdığınızda, ihtiyaçlarınıza uyan mevcut GCC sürüm numarasını kullanmak için komutları güncellediğinizden emin olun. Bu yanıttaki komutlar GCC 4.6.2 içindir.

GCC belgelerinin şunu söylediğine dikkat edin: "Gerekli araçların yeterince yeni sürümleri genellikle işe yarasa da, kitaplık gereksinimleri genellikle daha katıdır. Bazı durumlarda daha yeni sürümler işe yarayabilir, ancak belgelenen tam sürümleri kullanmak daha güvenlidir."

GMP

GMP, GNU Çok Duyarlı Aritmetik Kitaplığıdır.

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 Çok hassas kayan noktalı yuvarlama kitaplığıdır. GMP'ye bağlıdır.

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 Çok Duyarlı C kitaplığıdır. GMP ve MPFR'ye bağlıdır.

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, Yürütülebilir ve Bağlanabilir Biçim anlamına gelir. Bu kütüphane, mimariden bağımsız boyut ve endian desteği sağlar.

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 Derleyici Koleksiyonudur. GMP, MPFR, MPC ve ELF'ye bağlıdır.

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'yi aynı bağlama noktasındaki sıfırdan bir dizin içinde oluşturun. (/ Tmp içinde oluşturmak çapraz derleme ana bilgisayar sorunlarını tetikler)

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

Configure komutu ve bayraklarının hepsi tek bir komut satırında olmalıdır (bu gönderi, web sayfası genişliği nedeniyle bunları ayrı satırlarda gösterir).

Not: Kütüphane yolu ortam değişkenlerini yapılandırmak için tam yolu kullanırız ve ayarlamayız. Önyüklemeyi devre dışı bırakmayı ve paylaşımlı kitaplıkları devre dışı bırakmayı seçiyoruz çünkü onları istemiyoruz (tipik kullanıcılar her ikisini de isteyebilir) ve posix evrelerini ve varsayılan olan bayrakları, onları istediğimiz için kullanmayı seçiyoruz (tipik kullanıcılar diğer evreleri kullanmak veya atlama varsayılan bayraklar). YMMV ve bayraklar hakkında okuyun burada

/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

Bu sayfa, GCC kurulum bilgileri, nasıl oluşturulacağı, çeşitli bayraklar ve daha fazlası için harikadır:

http://www.acsu.buffalo.edu/~charngda/cc_build.html

Güncellemeler

Ppl kitaplıkları bellek optimizasyonları için kullanılabilir: bkz bugseng.com/products/ppl/Download (Yorumlarda teşekkürler Paul)

./Contrib/download_prerequisites'ı gcc kaynak dizininden çalıştırabilirsiniz. (Reddit'te N7P'ye teşekkürler)


2
Bilginize Yeni GCC 4.6.3 için yukarıdaki sürüm numaralarını güncellediğinizden emin olun (veya bunu yaparken geçerli olan her neyse)
joelparkerhenderson 02

12
./Contrib/download_prerequisites'ı gcc kaynak dizininden çalıştırabilirsiniz. Bu yorum Reddit'teki N7P'ye teşekkürler.
joelparkerhenderson

3
Hayır, önyükleme buna bağlı değildir. GMP, MPFR ve MPC oluşturmak için --disable-shared kullanmak mantıklıdır, ancak GCC'nin kendisi için geçerli değildir (ve download_prerequisites komut dosyasını kullanmak, zaten GMP, MPFR ve MPC'yi manuel olarak oluşturmanıza gerek olmadığı anlamına gelir). GCC'yi derlemek her zaman varsayılan olarak statik kitaplıklar ve paylaşılan kitaplıklar oluşturur , --disable-shared yalnızca paylaşılan kitapların olmadığı anlamına gelir, bu da çoğu insan için yanlış seçimdir.
Jonathan Wakely

8
--disable-sharedçoğu kişi için yanlıştır --disable-bootstrap, derlemeyi hızlandırabilir, ancak mevcut gcc sürümüne bağlı olarak başarısız olmasına neden olabilir, --enable-libgompyine de varsayılan olarak --enable-ltoetkinleştirilir, varsayılan olarak etkindir, --enable-thread-safegeçerli bir seçenek değildir --enable-threads=posix, bazı platformlarda varsayılan olarak etkinleştirilir, diğerlerinde geçerli değildir , --enable-tlsvarsayılan olarak etkindir, ... temelde bu talimatlar oldukça zayıftır
Jonathan Wakely, 19'12

1
Linuxbrew ile ev dizininize gcc (ve isteğe bağlı olarak glibc) kurmak için kullanabilirsiniz brew install gcc. Bkz linuxbrew.sh
Shaun Jackman

118

Kabul edilen cevap, onu gerekenden çok daha karmaşık hale getirir ve tüm sürümler için doğru değildir. GCC'yi kurmak --disable-sharedgenellikle çok kötü bir fikirdir. Daha kolay bir yaklaşım için http://gcc.gnu.org/wiki/InstallingGCC adresine bakın .

Tüm süreç (eğer yapı istediğiniz sürümü ile 4.6.2 yerine) bu fazla zor olması gerekir:

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

(Ancak yine de yukarıdaki bağlantıyı okuyun, yararlı bilgiler içermektedir.)

Görünüşe göre Ubuntu'daki bazı insanlar, ortamlarında GCC oluşturma sürecini engelleyen tonlarca pisliğe sahipler ve önce bunu kaldırmaları gerekiyor:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

2
Hayır, eksik adım yok
Jonathan Wakely

2
@ user2023370, GCC elbette kendi başlıklarını ve kitaplıklarını nasıl bulacağını biliyor. Dinamik bağlayıcıya kitaplıkları nasıl bulacağını söylemek için LD_LIBRARY_PATH ayarlamanız gerekir (çünkü çalıştırılabilir bir GCC çalıştırdığınızda artık dahil değildir), bkz. Gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

2
@einpoklum, sonra "bunun gibi bir şey" aynı değildi. Yukarıdaki adımlar işe yarar. Benim için düzenli olarak GCC'nin tüm sürümleriyle çalışıyorlar. Yüzlerce insan için çalışıyorlar.
Jonathan Wakely

3
Gelecekte referans olması açısından, bu benim için gcc-5.4.0 için çalıştı. Bahsedilmeyen tek şey, unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHburada önerilen her şeyden önce yapmam gerektiğiydi : stackoverflow.com/questions/12255058/…
Cantfindname

4
Bu benim için gcc 6.2.0 ile çalıştı ve kesinlikle kabul edilen cevap olmalı! (İşletim sistemleri / sürümleri vb.
David Doria

25

Bir küme üzerinde çalışıyorum. İnternete yalnızca ana düğüm bağlanır. Düğümlerdeki yazılımlar güncelliğini yitirmiştir ve genellikle bakımı yapılmamaktadır. Kök erişimim yok. İki seçeneğim var:

  • İhtiyacım olan statik yazılımları oluşturun (hesaplama paketleri); veya
  • statik derleyiciler oluşturun.

İkinciyi seçtim ve gcc, g ++ ve gfortran'ı oluşturdum.

Her şeyi içinde inşa ettim

PREFIX=$HOME/cmp/soft/sft

ve makekullandım için

THREADS=8

Aşağıda gcc,

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

En son gcc'yi buradan edinebilirsiniz: ftp://gcc.gnu.org/pub/gcc/releases

Bağımlılıklar burada bulunur: ftp://gcc.gnu.org/pub/gcc/infrastructure

Bağımlılıklar

Aşağıdaki komut dosyasıyla bağımlılıklar elde ediyorum:

#!/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

Aşağıdaki bash işlevi aşağıda kullanılmaktadır:

mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

Aşağıdaki komutların her biri indirilen lib dizininde verilecektir.

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
Bu gereksiz adımlar, karmaşık Cevabıma da kök erişimi olmadan, statik olarak bağlanan GCC kurmak ve sette gerekmez LD_LIBRARY_PATHçıkan GCC kullanmak.
Jonathan Wakely

Bu aynı zamanda, "iyi tanımlanmış" yollarda kurulu olan şeyle çakışmaların olduğu durumlarda da işe yarar (yani, standart prosedürün tamamen çalışmadığı durumlarda). 2017-06-19 itibarıyla son sürümler: gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn

7

Gmp ve mpfr'yi manuel olarak indirmem ve yazılım bağlantısı oluşturmam gerekmesi dışında yukarıda Jonathan'ın bahsettiği şeyi kullandık (gcc 4.4.2 dağıtımında muhtemelen "download_prerequisites" yoktur)

cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1  gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr

Btw, "-with-gmp" ve "with-mpfr" ile "./configure" kullanılması bana "configure: hata: nesne dosyalarının sonekini hesaplayamıyor: derlenemiyor" verdi. Bu nedenle gmp ve mpfr'nin srcs'lerini indirdim ve ardından ona gcc src top leve dizin içinden yumuşak bağlantı oluşturdum


2

GMP, MPFR ve MPC dahil GCC bağımlılıklarını kurmaya çalıştıktan sonra . Ek yükleme gereksinimleri, Hatalar ve eksik dosyalar ile karşılaştım; MPFR'nin yüklenmesi için gereken gmp.h başlık dosyası gibi. İşlem sırasında karşılaşacağınız bir dizi sorun var. Ancak, otomatik bağlantı ile GCC-X.0.0 veya sonraki bir sürümünü Oluşturmanın ve Kurmanın daha kolay bir yolu vardır .

SEÇENEK BİR.

Make ile Derleme zahmetinden kurtulmak için, dinamik kitaplıkları kurun ve bağlayın, Basitçe:

  • GCC-X.0.0 sürümünüzü indirin (en son sürüm: https://gcc.gnu.org/ )

  • Gcc-X-000.tar.gz dosyalarını bir konum / yol / konumuna çıkarın.

  • .Tar.gz dosyasını çıkardıktan sonra , / somepath / veya kaynak dizinde bulunan ./contrib/download_prerequisites komut dosyasını çalıştırın .

  • Bu komut dosyası içeren destek kütüphaneleri indirir: GMP, MPFR ve MPC ve yaratacak sembolik bağı olacağı sizin için İNŞA tüm gcc bağımlılıkları otomatik gcc Kurulum işleminin bir parçası olarak.

    İdi Yapı ve Bağlantı destek kütüphanelerine gerek yok indirilen için / somepath / düzenlenmek suretiyle Düzelteceğim yükleyin veya çalışan ./configure gibi bağlantılar dosya veya ekleme --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... çünkü bu, sembolik bağları oluşturan komut dosyasını çalıştırdığınızda yapıldı .

İKİNCİ SEÇENEK.

  • Destek kitaplıklarını standart sistem konumuna yüklemek için İşletim Sistemi Paketi yönetim sisteminizi kullanın. Ubuntu dahil Debian tabanlı sistem için libgmp-dev, libmpfr-dev'i kurun ve libmpc-dev paketlerini kurun . Fedora ve SUSE dahil RPM tabanlı sistemler için gmp-devel ve libmpc-devel ( SUSE üzerinde mpc-devel ) paketlerini kurun .
  • Bu seçenek, kitaplıkları ve başlık dosyalarını, GCC'yi oluştururken otomatik olarak bulunacakları standart bir sistem dizinine kuracaktır.
  • Bu, "sudo apt-get install libgmp-dev" veya "sudo apt-get install libmpfr-dev" kurulumunu çalıştırdığınızda ve bağlantı sizin için yapıldığında İşletim Sistemi Paketi kurulum Yönetiminin avantajıdır . Ek olarak, Make, Make install veya ./configure ile destek kitaplıkları oluşturmanız gerekmez .Ayrıca, işlemin tüm süreci tamamlaması birkaç dakika sürer.
  • Artık GCC Kurulumuna devam edebilirsiniz.

YAPILANDIRMA:

This is the GCC config Process, with gcc-X-000.tar.gz 

Konu:

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

NB:

--enable-diller örneğin c ++ veya c.

--disable-multilib ; sisteminize ve işletim sisteminize bağlı olarak multilib'i devre dışı bırakın, devam etmeniz için multilib hakkında bilgi verilecektir.

Yapımın tamamlanması uzun zaman alacak. Bununla birlikte, -j #no_pro seçeneğini verebilirsiniz. Bu, PC veya Mac'inizdeki işlemci sayısına bağlı olarak aynı anda paralel olarak Yap'ı çalıştırır.

Bu işlemin nasıl yürütüleceğine ilişkin ayrıntılı bilgi için https://gcc.gnu.org/wiki/InstallingGCC adresini ziyaret edebilirsiniz .


1

Joelparkerhenderson'ın en çok kabul ettiği cevabı takip ettim. İnternet üzerinden bir * NIX sistemine kurmak için bulabildiğim en iyi cevap budur.

Gelecek nesil için şunu eklemek istiyorum: "yükleme hatası: nesne dosyalarının son ekini hesaplayamıyor: derlenemiyor" gibi bir hata alırsanız

sonra LD_LIBRBARY_PATH dosyanızı / tmp / gcc / lib ile güncelleyin (bağlam için joelparkerhenderson'ın tam yanıtına bakın)

/ tmp / gcc / lib, gerekli tüm mpfr / mpc / gmp dosyalarını içerir, bu nedenle dosyalar ve çalışma zamanı bağlayıcı, siz onları LD_LIBRARY_PATH'ye eklemediğiniz sürece bulamaz. Ayrıca LD_LIBRARY_PATH;) dışa aktarmayı unutmayın. Burada daha fazla içerik: https://gcc.gnu.org/wiki/FAQ#configure_suffix


Sadece derleyiciyi kullanmak için LD_LIBRARY_PATH'inizi güncellemeniz aptalca. Eğer kullanırsanız stackoverflow.com/a/10662297/981959 yerine o gerekli değildir.
Jonathan Wakely
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.