Как установить GCC по частям с GMP, MPFR, MPC, ELF, без разделяемых библиотек?

Как мне установить 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 Multi-Precision Арифметическая библиотека
  • MPFR: GNU Библиотека округления чисел с плавающей точкой с множественной точностью
  • MPC: GNU C-библиотека с множественной точностью
  • ELF: библиотека исполняемого и связываемого формата
  • PPL: библиотека многогранников Пармы (необязательно, для оптимизации памяти)

7 ответов

Решение

Легкий путь

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

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

НКУ

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)

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

Я работаю на кластере. Только главный узел подключен к Интернету. Программное обеспечение на узлах устарело и, как правило, не поддерживается. У меня нет 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

Использовал то, о чем упоминал Джонатан, за исключением того, что мне пришлось вручную загружать 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

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

ВАРИАНТ ОДИН.

Чтобы избежать проблем сборки с помощью make, make install и связывания динамических библиотек, просто:

  • Загрузите версию GCC-X.0.0 (с последней версией по адресу: https://gcc.gnu.org/)
  • Извлеките файлы gcc-X-000.tar.gz в папку / somepath /.
  • После того как вы извлечете файл.tar.gz, запустите сценарий ./contrib/download_prerequisites, который находится в / somepath / или в исходном каталоге.
  • Этот скрипт загрузит библиотеки поддержки, в том числе: GMP, MPFR и MPC, и создаст для вас символические ссылки, которые автоматически СОЗДАЮТ все зависимости gcc как часть процесса установки gcc.

    Нет необходимости создавать библиотеки поддержки и ссылки, которые были загружены в / somepath /, выполнив команду Make, Make Install или запустив файл ./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

NB:

--enable-languages, такие как C++ или c.

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

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

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

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

Для последней версии GCC-13.2.0.

Для последнего числа оборотов в минуту (Red-hat,Fedora,Rocky-LinuxилиCentOS)

sudo dnf install libgmp-dev libmpfr-dev libmpc-develпакеты.

      tar xzf gcc-13.2.0.tar.gz
cd gcc-13.2.0
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-13.2.0/configure --prefix=$HOME/GCC-13.2.0 --enable-languages=all
make
make install

Другие вопросы по тегам