Bagaimana cara menginstal GCC sepotong demi sepotong dengan GMP, MPFR, MPC, ELF, tanpa pustaka bersama?

115

Bagaimana cara saya menginstal GCC (GNU Compiler Collection) sepotong demi sepotong, menggunakan versi saat ini,
menggunakan versi dependensi yang benar, tidak menggunakan manajer paket (seperti yum, rpm, apt, dpkg), dan tidak menggunakan pustaka bersama?

Pengembang umum kemungkinan besar ingin menginstal GCC dengan cara biasa, menggunakan pengelola paket Anda (yum, rpm, apt, dpkg, port, brew, dll.) Atau ikuti petunjuk di sini ( http://gcc.gnu.org/wiki/ MenginstalGCC ).

Pertanyaan saya adalah bagaimana menginstal GCC sepotong demi sepotong, tanpa pustaka bersama.

  • Saya menginginkan GCC yang sepenuhnya independen yang dapat dipindahkan di sekitar sistem saya tanpa menggunakan pustaka bersama, dan tanpa membuat pustaka bersama.
  • Inilah yang disebut GCC sebagai "cara yang sulit" dan tidak disarankan untuk pengguna biasa.

GCC bergantung pada:

  • GMP: GNU Multiple Precision Arithmetic Library
  • MPFR: Perpustakaan pembulatan titik mengambang presisi ganda GNU
  • MPC: Perpustakaan C presisi berganda GNU
  • ELF: Pustaka Format yang Dapat Dijalankan dan Ditautkan
  • PPL: Parma Polyhedra Library (opsional, untuk pengoptimalan memori)
joelparkerhenderson
sumber

Jawaban:

123

Cara Mudah

Jika Anda seorang pengembang biasa, Anda dapat menginstal dengan cara mudah, menggunakan petunjuk di http://gcc.gnu.org/wiki/InstallingGCC atau manajer paket sistem Anda seperti:

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

Cara yang Sulit

GCC mengatakan jawabannya di sini adalah "cara yang sulit" karena GCC membangun semua bagian demi bagian, dan tidak menggunakan pustaka bersama.

Infrastruktur GCC

Dapatkan infrastruktur GCC:

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

Letakkan unduhan di direktori temp (Anda dapat menggunakan direktori apa pun yang Anda inginkan).

/opt/downloads

Bangun infrastruktur di direktori temp yang berbeda dari direktori unduhan atau subdirektorinya:

/tmp/gcc

Konfigurasikan infrastruktur menggunakan pustaka statis seperti ini:

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

Bendera --disable-shared mungkin perlu dilihat lebih dekat tergantung pada kebutuhan Anda. Saya menggunakan --disable-shared karena saya hanya membuat kode statis, dan saya ingin memastikan bahwa saya tidak membuat kode bersama. Kebutuhan saya adalah memindahkan GCC yang dihasilkan di sekitar drive saya dengan mudah, jadi saya ingin semua kode statis, dan saya tidak ingin kode bersama. Jika Anda lebih suka kode bersama, hilangkan tanda --disable-shared.

Versi

Saat Anda menjalankan salah satu perintah dalam jawaban ini, pastikan untuk memperbarui perintah untuk menggunakan nomor versi GCC saat ini yang sesuai dengan kebutuhan Anda. Perintah dalam jawaban ini adalah untuk GCC 4.6.2.

Perhatikan bahwa dokumentasi GCC menyatakan: "Meskipun versi yang cukup baru dari alat yang diperlukan biasanya berfungsi, persyaratan pustaka biasanya lebih ketat. Versi yang lebih baru dapat berfungsi dalam beberapa kasus, tetapi lebih aman menggunakan versi persis yang didokumentasikan."

GMP

GMP adalah Perpustakaan Aritmatika Presisi Ganda 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 adalah library pembulatan floating-point presisi ganda GNU. Itu tergantung 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 adalah pustaka C presisi-berganda GNU. Itu tergantung GMP dan 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

PERI

ELF adalah singkatan dari Executable and Linkable Format. Library ini menyediakan ukuran yang tidak bergantung pada arsitektur dan dukungan 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 adalah Koleksi Kompilator GNU. Itu tergantung GMP, MPFR, MPC, dan 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

Bangun gcc di direktori awal pada titik pemasangan yang sama. (Membangunnya di dalam / tmp akan memicu masalah host kompilasi silang)

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

Perintah konfigurasi dan benderanya harus semuanya dalam satu baris perintah (posting ini menunjukkannya pada baris terpisah hanya karena lebar halaman web).

Catatan: Kami menggunakan jalur lengkap untuk mengonfigurasi dan tidak menyetel variabel lingkungan jalur perpustakaan. Kami memilih untuk menonaktifkan bootstrap dan menonaktifkan pustaka bersama karena kami tidak menginginkannya (pengguna biasa mungkin menginginkan keduanya), dan menggunakan utas posix dan menandai yang default karena kami menginginkannya (pengguna biasa mungkin ingin menggunakan utas lain atau melewati bendera default). YMMV dan baca tentang bendera di sini

/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

Halaman ini bagus untuk info penginstalan GCC, cara membuatnya, berbagai flag, dan banyak lagi:

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

Pembaruan

Pustaka ppl dapat digunakan untuk pengoptimalan memori: lihat bugseng.com/products/ppl/Download (Terima kasih Paul di komentar)

Anda dapat menjalankan ./contrib/download_prerequisites dari direktori sumber gcc. (Terima kasih untuk N7P di reddit)

joelparkerhenderson
sumber
2
FYI pastikan untuk memperbarui nomor versi di atas untuk GCC 4.6.3 baru (atau apa pun yang terbaru ketika Anda melakukan ini)
joelparkerhenderson
12
Anda dapat menjalankan ./contrib/download_prerequisites dari direktori sumber gcc. Komentar ini berkat N7P di Reddit.
joelparkerhenderson
3
Tidak, bootstrap tidak bergantung padanya. Masuk akal untuk menggunakan --disable-shared untuk membuat GMP, MPFR, dan MPC tetapi tidak untuk GCC itu sendiri (dan menggunakan skrip download_prerequisites berarti Anda tidak perlu membuat GMP, MPFR, dan MPC secara manual). Membangun GCC selalu membangun lib statis dan lib bersama secara default, --disable-shared hanya berarti Anda tidak mendapatkan lib bersama, yang merupakan pilihan yang salah bagi kebanyakan orang.
Jonathan Wakely
8
--disable-sharedsalah bagi kebanyakan orang, --disable-bootstrapmungkin mempercepat build, tetapi dapat menyebabkannya gagal bergantung pada versi gcc yang ada, tetap --enable-libgompdiaktifkan secara default, --enable-ltodiaktifkan secara default, --enable-thread-safebukan opsi yang valid, --enable-threads=posixdiaktifkan secara default di beberapa platform, tidak valid di platform lain , --enable-tlsdiaktifkan secara default, ... pada dasarnya instruksi ini sangat buruk
Jonathan Wakely
1
Anda dapat menggunakan Linuxbrew untuk menginstal gcc (dan secara opsional glibc) di direktori home Anda dengan brew install gcc. Lihat linuxbrew.sh
Shaun Jackman
118

Jawaban yang diterima membuatnya jauh lebih rumit dari yang diperlukan dan tidak benar untuk semua versi. Membangun GCC dengan --disable-sharedbiasanya merupakan ide yang sangat buruk. Lihat http://gcc.gnu.org/wiki/InstallingGCC untuk pendekatan yang lebih mudah.

The seluruh proses harus tidak lebih sulit daripada ini (menggantikan 4.6.2 dengan versi Anda ingin membangun):

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

(Tapi tolong baca tautan di atas, ini berisi informasi yang berguna.)

Rupanya beberapa orang di Ubuntu memiliki banyak sekali omong kosong di lingkungan mereka yang mengganggu proses pembuatan GCC, dan mereka perlu menghapusnya terlebih dahulu:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
sumber
2
Tidak, tidak ada langkah yang terlewat
Jonathan Wakely
2
@ user2023370, tentu saja GCC mengetahui cara menemukan semua header dan library-nya sendiri. Anda perlu menyetel LD_LIBRARY_PATH untuk memberi tahu penaut dinamis cara menemukan pustaka (karena saat Anda menjalankan GCC yang dapat dijalankan tidak lagi terlibat), lihat gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, maka "sesuatu seperti ini" Anda tidak sama. Langkah-langkah di atas berhasil. Mereka bekerja untuk saya secara teratur, dengan semua versi GCC. Mereka bekerja untuk ratusan orang.
Jonathan Wakely
3
Untuk referensi di masa mendatang, ini berfungsi untuk saya untuk gcc-5.4.0. Satu-satunya hal yang tidak disebutkan adalah bahwa saya harus unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHsebelum yang lainnya seperti yang disarankan di sini: stackoverflow.com/questions/12255058/…
Cantfindname
4
Ini berhasil untuk saya dengan gcc 6.2.0 dan pasti menjadi jawaban yang diterima! (Ini berfungsi di seluruh sistem operasi / versi, dll.)
David Doria
25

Saya bekerja di sebuah cluster. Hanya node master yang terhubung ke Internet. Perangkat lunak pada node sudah usang dan umumnya tidak terawat. Saya tidak memiliki akses root. Saya punya dua pilihan:

  • membangun perangkat lunak statis yang saya butuhkan (paket komputasi); atau
  • membangun kompiler statis.

Saya memilih yang kedua dan membangun gcc, g ++ dan gfortran.

Saya membangun semuanya

PREFIX=$HOME/cmp/soft/sft

dan untuk makesaya dulu

THREADS=8

Di bawah ini, gcc dibuat dengan

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Seseorang bisa mendapatkan gcc terbaru dari sini: ftp://gcc.gnu.org/pub/gcc/releases

Dependensi ditemukan di sini: ftp://gcc.gnu.org/pub/gcc/infrastructure

Dependensi

Saya mendapatkan ketergantungan dengan skrip berikut:

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

Fungsi bash berikut digunakan di bawah ini:

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

Setiap perintah di bawah ini akan dikeluarkan di direktori lib yang baru saja diunduh.

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
Adobe
sumber
1
Ini tidak perlu rumit, langkah-langkah dalam jawaban saya juga membangun GCC yang terhubung secara statis, tanpa akses root, dan Anda tidak perlu menyetel LD_LIBRARY_PATHuntuk menggunakan GCC yang dihasilkan.
Jonathan Wakely
Ini juga bekerja dalam situasi di mana ada konflik dengan apa pun yang diinstal di jalur "yang ditentukan dengan baik" (yaitu, kasus di mana prosedur standar langsung gagal bekerja). Versi terbaru pada 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

Menggunakan apa yang disebutkan Jonathan di atas kecuali bahwa saya harus mengunduh gmp dan mpfr secara manual dan membuat tautan lunak (distribusi gcc 4.4.2 mungkin tidak memiliki "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, menggunakan "-with-gmp" dan "with-mpfr" dengan "./configure" give me "configure: error: tidak dapat menghitung akhiran file objek: tidak dapat mengkompilasi". Karenanya saya mengunduh srcs dari gmp dan mpfr dan kemudian membuat tautan lunak untuk itu dari dalam gcc src top leve dir

vptr
sumber
2

Setelah mencoba menginstal dependensi GCC termasuk GMP, MPFR, dan MPC. Saya menemukan persyaratan penginstalan tambahan, Kesalahan dan file yang hilang; seperti file header gmp.h yang diperlukan oleh MPFR untuk diinstal. Ada banyak masalah yang akan Anda hadapi dalam prosesnya. Namun, Ada cara yang Lebih Mudah untuk Membangun dan Menginstal GCC-X.0.0 atau versi yang lebih baru dengan penautan otomatis .

OPSI SATU.

Untuk menghindari masalah Membangun dengan make, install dan Hubungkan pustaka dinamis, Cukup:

  • Unduh versi GCC-X.0.0 Anda (dengan versi terbaru dari: https://gcc.gnu.org/ )

  • Ekstrak file gcc-X-000.tar.gz ke lokasi / somepath /.

  • Setelah Anda mengekstrak file .tar.gz, jalankan skrip ./contrib/download_prerequisites yang terletak di / somepath / atau direktori sumber.

  • Skrip ini akan mengunduh pustaka pendukung termasuk: GMP, MPFR dan MPC dan akan membuat Symlinks untuk Anda, yang akan MEMBANGUN semua dependensi gcc secara otomatis sebagai bagian dari proses Instalasi gcc.

    Tidak perlu Membangun dan Menghubungkan pustaka dukungan yang telah diunduh ke / somepath / dengan menerbitkan Make, Make Install atau menjalankan ./configure file atau menambahkan link seperti --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... karena ini dilakukan ketika Anda menjalankan skrip yang membuat symlink .

OPSI DUA.

  • Gunakan sistem manajemen Paket OS Anda untuk menginstal pustaka dukungan di lokasi sistem standar. Untuk sistem berbasis Debian termasuk Ubuntu, Instal paket libgmp-dev, libmpfr-dev dan libmpc-dev . Untuk sistem berbasis RPM termasuk Fedora dan SUSE, instal paket gmp-devel, dan libmpc-devel ( mpc-devel on SUSE).
  • Opsi ini akan menginstal file library dan header di direktori sistem standar tempat file tersebut akan ditemukan secara otomatis saat membuat GCC.
  • Ini adalah keuntungan dari Manajemen Instalasi Paket OS ketika Anda menjalankan "sudo apt-get install libgmp-dev" atau "sudo apt-get install libmpfr-dev", pemasangan dan penautan telah selesai untuk Anda. Selain itu, Anda tidak perlu membangun pustaka dukungan dengan Make, Make install atau ./configure. Plus, prosesnya membutuhkan waktu beberapa menit untuk menyelesaikan semua proses.
  • Sekarang Anda dapat melanjutkan dengan Instalasi GCC.

KONFIGURASI:

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

Isu:

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-language seperti c ++ atau c.

--disable-multilib ; nonaktifkan multilib berdasarkan sistem dan OS Anda, Anda akan ditanya tentang multilib untuk melanjutkan.

Proses pembuatan akan memakan waktu lama. Namun, Anda dapat mengeluarkan opsi -j #no_pro. Ini akan menjalankan Make secara bersamaan secara paralel berdasarkan jumlah prosesor di PC atau Mac Anda.

Untuk informasi rinci tentang cara menjalankan proses ini, Anda dapat mengunjungi: https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
sumber
1

Saya mengikuti jawaban yang paling diterima oleh joelparkerhenderson. Ini adalah jawaban terbaik yang dapat saya temukan untuk menginstal pada sistem * NIX melalui internet.

Untuk anak cucu saya ingin menambahkan bahwa jika Anda mendapatkan kesalahan seperti "kesalahan pemasangan: tidak dapat menghitung akhiran file objek: tidak dapat mengkompilasi"

lalu perbarui LD_LIBRBARY_PATH Anda dengan / tmp / gcc / lib (Lihat jawaban lengkap joelparkerhenderson untuk konteksnya)

/ tmp / gcc / lib berisi semua mpfr / mpc / gmp yang diperlukan sehingga file dan run time linker tidak dapat menemukannya kecuali Anda menambahkannya ke LD_LIBRARY_PATH. Juga jangan lupa untuk mengekspor LD_LIBRARY_PATH;). Konteks lebih lanjut di sini: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
sumber
Harus memperbarui LD_LIBRARY_PATH Anda hanya untuk menggunakan kompilator itu bodoh. Jika Anda menggunakan stackoverflow.com/a/10662297/981959, hal itu tidak diperlukan.
Jonathan Wakely