Jak zainstalować GCC kawałek po kawałku z GMP, MPFR, MPC, ELF, bez współdzielonych bibliotek?

115

Jak zainstalować GCC (kolekcję kompilatorów GNU) kawałek po kawałku, używając aktualnej wersji,
używając poprawnych wersji zależności, nie używając menedżera pakietów (jak yum, rpm, apt, dpkg) i nie używając bibliotek współdzielonych?

Typowi programiści prawdopodobnie będą chcieli zainstalować GCC w typowy sposób, użyj swojego menedżera pakietów (yum, rpm, apt, dpkg, port, brew, itp.) Lub postępuj zgodnie z instrukcjami tutaj ( http://gcc.gnu.org/wiki/ Instalowanie GCC ).

Moje pytanie brzmi: jak zainstalować GCC kawałek po kawałku, bez współdzielonych bibliotek.

  • Chcę w pełni niezależnego GCC, które można przenosić po moim systemie bez korzystania z żadnych bibliotek współdzielonych i bez tworzenia żadnych bibliotek współdzielonych.
  • To właśnie GCC nazywa „trudną drogą” i nie jest zalecane dla typowych użytkowników.

GCC zależy od:

  • GMP: Biblioteka arytmetyczna GNU Multiple Precision Arithmetic Library
  • MPFR: GNU Biblioteka zmiennoprzecinkowego zaokrąglania wielu precyzji
  • MPC: biblioteka GNU o wielu precyzjach w C.
  • ELF: Biblioteka plików wykonywalnych i formatów z możliwością łączenia
  • PPL: Parma Polyhedra Library (opcjonalnie, do optymalizacji pamięci)
joelparkerhenderson
źródło

Odpowiedzi:

123

Łatwa droga

Jeśli jesteś typowym programistą, możesz zainstalować w łatwy sposób, korzystając z instrukcji podanych na stronie http://gcc.gnu.org/wiki/InstallingGCC lub menedżera pakietów systemowych, takich jak:

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

Trudna droga

GCC mówi, że odpowiedź jest tutaj „trudna”, ponieważ buduje wszystko kawałek po kawałku i nie korzysta z bibliotek współdzielonych.

Infrastruktura GCC

Zdobądź infrastrukturę GCC:

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

Umieść pliki do pobrania w katalogu tymczasowym (możesz użyć dowolnego katalogu).

/opt/downloads

Zbuduj infrastrukturę w katalogu tymczasowym, który różni się od katalogu pobierania lub jego podkatalogów:

/tmp/gcc

Skonfiguruj infrastrukturę za pomocą bibliotek statycznych, takich jak ta:

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

Flaga --disable-shared może być warta bliższego przyjrzenia się w zależności od potrzeb. Używam --disable-shared, ponieważ tworzę tylko kod statyczny i chcę się upewnić, że nie buduję żadnego udostępnionego kodu. Moją potrzebą jest łatwe przenoszenie wynikowego GCC na moje dyski, więc chcę cały kod statyczny i nie chcę żadnego wspólnego kodu. Jeśli wolisz udostępniony kod, pomiń flagę --disable-shared.

Wersje

Po uruchomieniu któregokolwiek z poleceń w tej odpowiedzi pamiętaj, aby zaktualizować polecenia, aby używały bieżącego numeru wersji GCC, który odpowiada Twoim potrzebom. Polecenia w tej odpowiedzi dotyczą GCC 4.6.2.

Zwróć uwagę, że dokumentacja GCC mówi: „Chociaż każda wystarczająco nowa wersja wymaganych narzędzi zwykle działa, wymagania dotyczące bibliotek są generalnie surowsze. Nowsze wersje mogą działać w niektórych przypadkach, ale bezpieczniej jest używać dokładnie udokumentowanych wersji”.

GMP

GMP to biblioteka arytmetyczna 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 to biblioteka GNU do zaokrąglania liczb zmiennoprzecinkowych o wielokrotnej precyzji. To zależy od 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

RPP

MPC to biblioteka GNU Multiple-Precision C. To zależy od GMP i 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 oznacza format wykonywalny i możliwy do połączenia. Ta biblioteka zapewnia rozmiar i obsługę endianów niezależne od architektury.

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 to kolekcja kompilatorów GNU. To zależy od GMP, MPFR, MPC i 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

Zbuduj gcc w katalogu zapasowym w tym samym punkcie montowania. (Zbudowanie go w / tmp spowodowałoby problemy z kompilacją krzyżową hosta)

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

Polecenie configure i jego flagi muszą znajdować się w jednym wierszu poleceń (ten post pokazuje je w osobnych wierszach tylko ze względu na szerokość strony internetowej).

Uwaga: Używamy pełnej ścieżki do konfigurowania i nie ustawiamy zmiennych środowiskowych ścieżki biblioteki. Decydujemy się na wyłączenie ładowania początkowego i bibliotek współdzielonych, ponieważ ich nie chcemy (typowi użytkownicy mogą chcieć obu), a także używamy wątków posix i flag, które są domyślne, ponieważ ich chcemy (typowi użytkownicy mogą chcieć użyć innych wątków lub pominąć flagi domyślne). YMMV i przeczytaj o flagach tutaj

/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

Ta strona jest świetna, jeśli chodzi o informacje dotyczące instalacji GCC, jak go zbudować, różne flagi i nie tylko:

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

Aktualizacje

Biblioteki ppl mogą być używane do optymalizacji pamięci: zobacz bugseng.com/products/ppl/Download (dziękuję Paul w komentarzach)

Możesz uruchomić ./contrib/download_prerequisites z katalogu źródłowego gcc. (Dzięki N7P na reddit)

joelparkerhenderson
źródło
2
Do Twojej wiadomości, pamiętaj, aby zaktualizować powyższe numery wersji dla nowego GCC 4.6.3 (lub czegokolwiek innego, kiedy to robisz)
joelparkerhenderson
12
Możesz uruchomić ./contrib/download_prerequisites z katalogu źródłowego gcc. Ten komentarz jest dzięki N7P na Reddicie.
joelparkerhenderson
3
Nie, ładowanie początkowe nie zależy od tego. Sensowne jest używanie --disable-shared do budowania GMP, MPFR i MPC, ale nie do samego GCC (a użycie skryptu download_prerequisites oznacza, że ​​i tak nie musisz ręcznie budować GMP, MPFR i MPC). Budowanie GCC zawsze domyślnie buduje biblioteki statyczne i biblioteki współdzielone, --disable-shared oznacza po prostu, że nie masz bibliotek współdzielonych, co jest złym wyborem dla większości ludzi.
Jonathan Wakely
8
--disable-sharedjest zły dla większości ludzi, --disable-bootstrapmoże przyspieszyć kompilację, ale może spowodować awarię w zależności od istniejącej wersji gcc, --enable-libgompmimo to domyślnie --enable-ltowłączony, domyślnie włączony, --enable-thread-safenie jest poprawną opcją, --enable-threads=posixdomyślnie włączony na niektórych platformach, nieważny na innych , --enable-tlsdomyślnie włączone, ... w zasadzie te instrukcje są dość kiepskie
Jonathan Wakely
1
Możesz użyć Linuxbrew, aby zainstalować gcc (i opcjonalnie glibc) w swoim katalogu domowym z brew install gcc. Zobacz linuxbrew.sh
Shaun Jackman
118

Przyjęta odpowiedź sprawia, że ​​jest to o wiele bardziej skomplikowane niż to konieczne i nie jest poprawne dla wszystkich wersji. Budowanie GCC --disable-sharedjest zwykle bardzo złym pomysłem. Zobacz http://gcc.gnu.org/wiki/InstallingGCC, aby uzyskać łatwiejsze podejście.

Cały proces nie powinien być trudniejszy niż ten (zastępując 4.6.2 z wersją chcesz zbudować):

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

(Ale mimo wszystko przeczytaj powyższy link, zawiera on przydatne informacje.)

Najwyraźniej niektórzy ludzie w Ubuntu mają mnóstwo bzdur w swoim środowisku, które kolidują z procesem budowania GCC i muszą najpierw to usunąć:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
źródło
2
Nie, nie ma brakującego kroku
Jonathan Wakely
2
@ user2023370, GCC oczywiście wie, jak znaleźć wszystkie swoje własne nagłówki i biblioteki. Musisz ustawić LD_LIBRARY_PATH, aby powiedzieć dynamicznemu linkerowi, jak znaleźć biblioteki (ponieważ po uruchomieniu wykonywalnego GCC nie jest to już zaangażowane), zobacz gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, więc twoje „coś takiego” nie było takie samo. Powyższe kroki działają. Pracują dla mnie regularnie, ze wszystkimi wersjami GCC. Pracują dla setek ludzi.
Jonathan Wakely
3
Na przyszłość, to zadziałało dla mnie w przypadku gcc-5.4.0. Jedyną rzeczą, o której nie wspomniano, było to, że musiałem unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHprzed wszystkim innym, jak sugerowano tutaj: stackoverflow.com/questions/12255058/…
Cantfindname
4
To zadziałało dla mnie z gcc 6.2.0 i zdecydowanie powinno być akceptowaną odpowiedzią! (Działa w różnych systemach operacyjnych / wersjach itp.)
David Doria
25

Pracuję na klastrze. Tylko węzeł główny jest połączony z Internetem. Oprogramowanie na węzłach jest przestarzałe i generalnie nie jest obsługiwane. Nie mam uprawnień roota. Mam dwie możliwości:

  • budować statyczne oprogramowanie, którego potrzebuję (pakiety obliczeniowe); lub
  • budować kompilatory statyczne.

Wybrałem drugą i zbudowałem gcc, g ++ i gfortran.

Zbudowałem wszystko

PREFIX=$HOME/cmp/soft/sft

i makeużyłem

THREADS=8

Poniżej gcc jest zbudowany z

  • GMP
  • MPFR
  • RPP
  • ISL
  • CLOOG

Najnowszą wersję gcc można pobrać tutaj: ftp://gcc.gnu.org/pub/gcc/releases

Zależności można znaleźć tutaj: ftp://gcc.gnu.org/pub/gcc/infrastructure

Zależności

Otrzymuję zależności z następującym skryptem:

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

Poniższa funkcja bash jest używana poniżej:

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

Każde z poniższych poleceń należy wydać w katalogu właśnie pobranej biblioteki.

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

RPP

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
Cegła suszona na słońcu
źródło
1
Jest to niepotrzebnie skomplikowane, kroki w mojej odpowiedzi również tworzą statycznie połączone GCC, bez dostępu do roota i nie musisz ustawiać LD_LIBRARY_PATHkorzystania z wynikowego GCC.
Jonathan Wakely
Działa to również w sytuacjach, w których występują konflikty z tym, co jest zainstalowane w „dobrze zdefiniowanych” ścieżkach (tj. W przypadkach, gdy standardowa procedura zupełnie nie działa). Najnowsze wersje z dnia 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
Michael Goldshteyn
7

Użyłem tego, o czym wspomniał Jonathan powyżej, z wyjątkiem tego, że musiałem ręcznie pobrać gmp i mpfr i utworzyć miękki link (dystrybucja gcc 4.4.2 prawdopodobnie nie ma "download_prerequisites")

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

Btw, używając "-with-gmp" i "with-mpfr" z "./configure" dał mi "configure: błąd: nie można obliczyć sufiksu plików obiektowych: nie można kompilować". Dlatego pobrałem srcs z gmp i mpfr, a następnie utworzyłem miękki link do niego z poziomu gcc src top leve dir

vptr
źródło
2

Po próbie zainstalowania zależności GCC, w tym GMP, MPFR i MPC. Napotkałem dodatkowe wymagania dotyczące instalacji, błędy i brakujące pliki; takie jak plik nagłówkowy gmp.h wymagany przez MPFR do zainstalowania. Istnieje wiele problemów, które napotkasz podczas tego procesu. Istnieje jednak łatwiejszy sposób na zbudowanie i zainstalowanie GCC-X.0.0 lub nowszej wersji z automatycznym łączeniem .

OPCJA PIERWSZA.

Aby zaoszczędzić sobie kłopotów związanych z budowaniem za pomocą make, zainstaluj i połącz biblioteki dynamiczne, po prostu:

  • Pobierz swoją wersję GCC-X.0.0 (najnowszą wersję z: https://gcc.gnu.org/ )

  • Rozpakuj pliki gcc-X-000.tar.gz do lokalizacji / gdzieś /.

  • Po rozpakowaniu pliku .tar.gz uruchom skrypt ./contrib/download_prerequisites, który znajduje się w katalogu / somepath / lub katalogu źródłowym.

  • Ten skrypt pobrać biblioteki obsługi w tym: GMP, MPFR i RPP i będzie utworzyć dowiązania symboliczne dla Ciebie, że będzie BUILD wszystkie zależności gcc automatycznie jako część procesu instalacji gcc.

    Nie ma potrzeby budowania i łączenia bibliotek pomocniczych, które zostały pobrane do / somepath / przez wydanie Make, Make Install lub uruchomienie pliku ./configure lub dodanie linków, takich jak --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... ponieważ zostało to zrobione podczas uruchamiania skryptu, który utworzył dowiązania symboliczne .

OPCJA DRUGA.

  • Użyj systemu zarządzania pakietami systemu operacyjnego, aby zainstalować biblioteki obsługi w standardowej lokalizacji systemu. W przypadku systemu opartego na Debianie, w tym Ubuntu, zainstaluj pakiety libgmp-dev, libmpfr-dev i libmpc-dev . W przypadku systemu opartego na RPM, w tym Fedory i SUSE, zainstaluj pakiety gmp-devel i libmpc-devel ( mpc-devel w SUSE).
  • Ta opcja zainstaluje biblioteki i pliki nagłówkowe w standardowym katalogu systemowym, w którym zostaną znalezione automatycznie podczas budowania GCC.
  • Jest to zaleta zarządzania instalacją pakietów systemu operacyjnego, gdy wywołujesz instalację „sudo apt-get install libgmp-dev” lub „sudo apt-get install libmpfr-dev”, a proces łączenia jest wykonywany za Ciebie. Ponadto nie musisz budować bibliotek pomocniczych za pomocą Make, Make install lub ./configure. Ponadto cały proces trwa kilka minut.
  • Teraz możesz kontynuować instalację GCC.

KONFIGURACJA:

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

Kwestia:

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

Uwaga:

- języki umożliwiające włączenie, takie jak c ++ lub c.

--disable-multilib ; wyłączyć multilib w oparciu o system i system operacyjny, pojawi się monit o podanie multilib, aby kontynuować.

Wykonanie Make zajmie dużo czasu. Możesz jednak wydać opcję -j #no_pro. Spowoduje to równoległe uruchomienie programu Make na podstawie liczby procesorów w komputerze PC lub Mac.

Szczegółowe informacje o tym, jak przeprowadzić ten proces, można znaleźć na stronie : https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
źródło
1

Postępowałem zgodnie z najczęściej akceptowaną odpowiedzią Joelparkerhendersona. To najlepsza odpowiedź, jaką udało mi się znaleźć w przypadku instalacji w systemie * NIX przez Internet.

Dla przyszłych pokoleń chcę dodać, że jeśli pojawi się błąd typu „błąd instalacji: nie można obliczyć sufiksu plików obiektowych: nie można skompilować”

następnie zaktualizuj swoją ścieżkę LD_LIBRBARY_PATH o / tmp / gcc / lib (zobacz pełną odpowiedź joelparkerhendersona w celu zapoznania się z kontekstem)

/ tmp / gcc / lib zawiera wszystkie wymagane pliki mpfr / mpc / gmp, więc konsolidator czasu wykonywania nie może ich znaleźć, chyba że dodasz je do LD_LIBRARY_PATH. Nie zapomnij także wyeksportować LD_LIBRARY_PATH;). Więcej kontekstu tutaj: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
źródło
Konieczność aktualizowania LD_LIBRARY_PATH tylko po to, aby użyć kompilatora, jest głupia. Jeśli zamiast tego używasz stackoverflow.com/a/10662297/981959 , nie jest to konieczne.
Jonathan Wakely