Как установить GCC по частям с GMP, MPFR, MPC, ELF, без общих библиотек? - PullRequest
110 голосов
/ 26 февраля 2012

Как установить GCC (Коллекция компиляторов GNU) по частям, используя текущую версию,
, используя правильные версии зависимостей, не используя менеджер пакетов (например, yum, rpm, apt, dpkg), ине используете разделяемые библиотеки?

Типичные разработчики, вероятно, захотят установить GCC обычным способом, использовать менеджер пакетов (yum, rpm, apt, dpkg, port, brew и т. д.) или следуйте инструкциям здесь (http://gcc.gnu.org/wiki/InstallingGCC).

Мой вопрос заключается в том, как устанавливать GCC по частям, без общих библиотек.

  • Я хочу полностью независимый GCC, который можно перемещать по моей системе без использования каких-либо общихбиблиотеки и без создания общих библиотек.
  • Это то, что GCC называет "трудным путем", и это не рекомендуется для обычных пользователей.

GCC зависит от:

  • GMP: библиотека арифметики с множественной точностью GNU
  • MPFR: GNU библиотека округления с плавающей точкой с множественной точностью
  • MPC: библиотека C с высокой точностью GNU
  • ELF: библиотека исполняемых и связываемых форматов
  • PPL: библиотека многогранников Пармы (необязательно, для оптимизации памяти)

Ответы [ 6 ]

118 голосов
/ 26 февраля 2012

Легкий путь

Если вы типичный разработчик, вы можете установить простой способ, используя инструкции по адресу 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 по моим дискам, поэтому мне нужен весь статический код, и я не хочу никакого общего кода. Если вы предпочитаете общий код, пропустите флаг --disable-shared.

Версия

При выполнении любой из команд в этом ответе обязательно обновите команды, чтобы использовать текущий номер версии GCC, который соответствует вашим потребностям. Команды в этом ответе предназначены для GCC 4.6.2.

Обратите внимание, что в документации GCC говорится: «Хотя обычно работают достаточно новые версии необходимых инструментов, требования к библиотекам, как правило, более строгие. В некоторых случаях могут работать более новые версии, но безопаснее использовать точные документированные версии».

GMP

GMP - это арифметическая библиотека GNU Multi-Precision.

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. Это зависит от 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

1054 * НКУ * 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)

115 голосов
/ 19 мая 2012

Принятый ответ делает его далеко более сложным, чем необходимо, и не является правильным для всех версий.Создание 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
24 голосов
/ 26 февраля 2014

Я работаю на кластере. Только главный узел подключен к Интернету. Программное обеспечение на узлах устарело и, как правило, не поддерживается. У меня нет root-доступа. У меня есть два варианта:

  • сборка нужного мне статического ПО (вычислительные пакеты); или
  • сборка статических компиляторов.

Я выбрал второй и построил 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 "\"\$$#\""; }

Каждая из приведенных ниже команд должна быть выполнена в директории только что загруженной библиотеки.

* * 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

НКУ

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
6 голосов
/ 17 ноября 2012

Использовал то, что упомянул Джонатан выше, за исключением того, что мне пришлось вручную загружать 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: error: невозможно вычислить суффикс объектных файлов: невозможно компилировать». Поэтому я скачал srcs из gmp и mpfr, а затем создал мягкую ссылку на него из gcc src top leve dir

1 голос
/ 24 апреля 2018

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

OPTION ONE.

Чтобы избежать проблем сборки с помощью 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, MPFR и MPC и создаст для вас символические ссылки , которые будут BUILD все зависимости gcc автоматически как часть процесса установки gcc.

    Нет необходимости собирать и связывать библиотеки поддержки, которые были загружены в / somepath / с помощью команды Make,Выполните установку или запустите файл . / 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. Plus, процесс занимает несколько минут, чтобы завершить весь процесс.
  • Теперь вы можете продолжить установку 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

NB:

- языки включения , такие как c ++ или c.

- disable-multilib ;отключите multilib в зависимости от вашей системы и операционной системы, вам будет предложено продолжить работу с multilib.

Выполнение make займет много времени.Однако вы можете использовать опцию -j #no_pro.Это запустит Make одновременно параллельно на основе числа процессоров на вашем ПК или Mac.

Для получения подробной информации о том, как выполнить этот процесс, вы можете посетить: https://gcc.gnu.org/wiki/InstallingGCC.

0 голосов
/ 18 августа 2015

Я последовал за самым верным ответом от 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

...