Як встановити GCC по частинах за допомогою GMP, MPFR, MPC, ELF, без спільних бібліотек?


115

Як встановити GCC (колекцію компілятора GNU) по частинах, використовуючи поточну версію,
використовуючи правильні версії залежностей, не використовуючи менеджер пакунків (наприклад, 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: багатоточна бібліотека C GNU
  • ELF: Бібліотека виконуваного та пов'язаного формату
  • PPL: бібліотека багатогранників Парма (необов’язково для оптимізації пам'яті)

Відповіді:


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 каже, що відповідь тут "важкий шлях", оскільки він будує все по частинах і не використовує спільні бібліотеки.

Інфраструктура 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 навколо моїх дисків, тому я хочу весь статичний код, і я не хочу будь-якого спільного коду. Якщо ви віддаєте перевагу спільний код, опустіть прапор - відключити-спільний доступ.

Версії

Коли ви запускаєте будь-яку з команд у цій відповіді, не забудьте оновити команди, щоб використовувати поточний номер версії 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 - це багатоточна бібліотека C GNU. Це залежить від 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 розшифровується як виконуваний та пов'язаний формат. Ця бібліотека забезпечує незалежний від архітектури розмір та підтримку ендіан.

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 та її прапори повинні бути в одному командному рядку (ця публікація відображає їх в окремих рядках саме через ширину веб-сторінки).

Примітка. Ми використовуємо повний шлях для налаштування та не встановлення змінних умов середовища бібліотеки. Ми вирішуємо відключити завантажувальну програму та відключити спільні бібліотеки, тому що ми не хочемо їх (типові користувачі можуть хотіти обох), а також використовувати нитки 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 (спасибі Павло в коментарях)

Ви можете запустити ./contrib/download_prerequisites з вихідного каталогу gcc. (Завдяки N7P в Reddit)


2
FYI не забудьте оновити вищевказані номери версій для нового GCC 4.6.3 (або будь-якого поточного, коли ви це робите)
joelparkerhenderson

12
Ви можете запустити ./contrib/download_prerequisites з вихідного каталогу gcc. Цей коментар завдяки N7P на Reddit.
joelparkerhenderson

3
Ні, завантаження не залежить від цього. Має сенс використовувати - deisable-shared для побудови GMP, MPFR та MPC, але не для самого GCC (а використання сценарію download_prerequisites означає, що вам не потрібно будувати GMP, MPFR та MPC вручну). Створення GCC завжди створює статичні libs та спільні libs за замовчуванням.
Джонатан Векі

8
--disable-sharedнеправильно для більшості людей, --disable-bootstrapможе пришвидшити збірку, але може призвести до виходу з ладу залежно від існуючої версії gcc, --enable-libgompувімкнено за замовчуванням, --enable-ltoувімкнено за замовчуванням, --enable-thread-safeне допустимий варіант, --enable-threads=posixвключений за замовчуванням на деяких платформах, недійсний на інших , --enable-tlsувімкнено за замовчуванням, ... в основному ці вказівки досить погані
Джонатан Уейклі

1
Ви можете використовувати Linuxbrew для встановлення gcc (і необов'язково glibc) у свій домашній каталог brew install gcc. Дивіться linuxbrew.sh
Шон Джекман

118

Прийнята відповідь робить її набагато складнішою, ніж необхідна, і не є правильною для всіх версій. Створення GCC за допомогою, --disable-sharedяк правило, дуже погана ідея. Простіший підхід див. У розділі 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
Ні, кроку немає
Джонатан Уейклі

2
@ user2023370, GCC, звичайно, знає, як знайти всі власні заголовки та бібліотеки. Вам потрібно встановити LD_LIBRARY_PATH сказати динамічний компонувальник , як годі й шукати бібліотеки (бо , коли ви запускаєте виконуваний GCC більше не братиме участі), см gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Джонатан Wakely

2
@einpoklum, то ваше "щось подібне" було не те саме. Наведені вище дії. Вони працюють для мене регулярно, з усіма версіями GCC. Вони працюють для сотень людей.
Джонатан Вейклі

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 і, безумовно, має бути прийнятою відповіддю! (Працює в операційних системах / версіях тощо)
Девід Дорія

25

Я працюю над кластером. До Інтернету підключено лише головний вузол. Програмне забезпечення на вузлах застаріло і зазвичай не підтримується. У мене немає кореневого доступу. У мене є два варіанти:

  • будувати потрібне мені статичне програмне забезпечення (обчислювальні пакети); або
  • будувати статичні компілятори.

Я вибрав другий і побудував gcc, g ++ та gfortran.

Я все вбудував

PREFIX=$HOME/cmp/soft/sft

і для цього makeя використовував

THREADS=8

Нижче вбудований gcc з

  • GMP
  • MPFR
  • ГДК
  • ISL
  • КЛАГ

Тут можна отримати останні новини 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 "\"\$$#\""; }

Кожна з команд, поданих нижче, має бути видана в реєстрі щойно завантажених файлів.

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

ГДК

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

КЛАГ

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.
Джонатан Уейклі

Це також працює в ситуаціях, коли виникають конфлікти з тим, що встановлено у "чітко визначених" контурах (тобто у випадках, коли стандартна процедура не працює). Останні версії станом на 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

Використовували те, що Джонатан згадував вище, за винятком того, що мені довелося завантажувати 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

Btw, використовуючи "-with-gmp" та "with-mpfr" з "./configure" дав мені "configure: error: не можна обчислити суфікс файлів об'єкта: не можна компілювати". Отже, я завантажив srcs з gmp та mpfr, а потім створив м'яке посилання на нього зсередини gcc src top leve dir


2

Після спроби встановити залежності GCC, включаючи GMP, MPFR та MPC. Я зіткнувся з додатковими вимогами до встановлення, помилками та відсутніми файлами; наприклад, файл заголовка gmp.h, необхідний MPFR для встановлення. Виникла ціла низка питань, з якими ви зіткнетесь у процесі. Однак існує простіший спосіб створення та встановлення GCC-X.0.0 або пізнішої версії з автоматичним зв'язуванням .

ВАРІАНТ перший.

Щоб зберегти проблеми зі створенням з make, зробіть встановлення та Пов’язання динамічних бібліотек, просто:

  • Завантажте GCC-X.0.0 -версію (з останньою версією: https://gcc.gnu.org/ )

  • Витягніть файли gcc-X-000.tar.gz до місця розташування / somepath /.

  • Після того як ви вилучили файл .tar.gz, запустіть ./contrib/download_prerequisites скрипт, який знаходиться в / somepath / або в вихідному каталозі.

  • Цей сценарій буде завантажувати бібліотеки підтримки , включаючи: GMP, MPFR і MPC і створить Symlinks для вас, що буде BUILD все залежності GCC автоматично як частина процесу установки МКІ.

    Немає необхідності створювати та підтримувати бібліотеки підтримки, завантажені в / somepath /, видавши Make, Make Install або run ./configure файл або додаючи посилання, такі як --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... тому що це було зроблено під час запуску сценарію, який створював символьні посилання .

ВАРІАНТ ДВОЙ.

  • Використовуйте вашу систему управління пакетами ОС, щоб встановити бібліотеки підтримки в стандартне розташування системи. Для системи на базі Debian, включаючи Ubuntu, встановити пакети libgmp-dev, libmpfr-dev та libmpc-dev . Для систем на основі RPM, включаючи Fedora та SUSE, встановіть пакети gmp-devel та libmpc-devel ( mpc-devel на SUSE).
  • Цей параметр встановить бібліотеки та файли заголовків у стандартній системній директорії, де вони будуть автоматично знайдені під час створення GCC.
  • Це перевага управління встановленням пакету ОС, коли ви викликаєте "sudo apt-get install libgmp-dev" або "sudo apt-get install libmpfr-dev", і встановлення посилань робиться за вас. Крім того, вам не потрібно створювати бібліотеки підтримки за допомогою 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.

- відключити-мультиліб ; вимкніть мультиліб на основі вашої системи та ОС, вам буде запропоновано продовжити функцію багатолітра.

Для виготовлення знадобиться багато часу. Однак ви можете випустити варіант -j #no_pro. Це запустить Зробити одночасно паралельно залежно від кількості процесорів на вашому ПК або Mac.

Детальну інформацію про те, як виконати цей процес, ви можете відвідати: 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 замість цього, це не потрібно.
Джонатан Вейклі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.