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

Ответы:

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

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)

joelparkerhenderson
источник
2
К вашему сведению, я обязательно обновляю указанные выше номера версий для нового GCC 4.6.3 (или любого
другого
12
Вы можете запустить ./contrib/download_prerequisites из исходного каталога gcc. Этот комментарий сделан благодаря N7P на Reddit.
joelparkerhenderson
3
Нет, начальная загрузка от этого не зависит. Имеет смысл использовать --disable-shared для создания GMP, MPFR и MPC, но не для самого GCC (а использование сценария download_prerequisites означает, что вам в любом случае не нужно создавать GMP, MPFR и MPC вручную). Сборка GCC всегда создает статические библиотеки и общие библиотеки по умолчанию, --disable-shared просто означает, что у вас нет общих библиотек, что является неправильным выбором для большинства людей.
Джонатан Уэйкли,
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
Джонатан Уэйкли
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

Работаю на кластере. Только главный узел подключен к Интернету. Программное обеспечение на узлах устарело и обычно не обслуживается. У меня нет 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
саман
источник
1
Это излишне сложно, шаги в моем ответе также создают статически связанный GCC без корневого доступа, и вам не нужно настраивать LD_LIBRARY_PATHиспользование полученного GCC.
Джонатан Уэйкли,
Это также работает в ситуациях, когда есть конфликты с тем, что установлено по «четко определенным» путям (т. Е. В случаях, когда стандартная процедура полностью не работает). Последние версии от 19.06.2017: gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Майкл Гольдштейн
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

Кстати, использование "-with-gmp" и "with-mpfr" с "./configure" дало мне "configure: error: cannot compute суффикс объектных файлов: невозможно скомпилировать". Поэтому я загрузил srcs gmp и mpfr, а затем создал мягкую ссылку на них из каталога gcc src top leve

vptr
источник
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 или запустив файл ./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 .

Juniar
источник
1

Я последовал за наиболее распространенным ответом Джоэлпаркерхендерсона. Это лучший ответ, который я мог найти для установки в системе * 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 , в этом нет необходимости.
Джонатан Уэйкли,