Как установить 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 Multiple Precision Arithmetic Library
  • MPFR: GNU Многоточная библиотека округления с плавающей запятой
  • MPC: GNU Multiple-precision c library
  • ELF: библиотека исполняемых и связываемых форматов
  • ppl: библиотека многогранников Пармы (необязательно, для оптимизации памяти)
6 103

6 ответов:

Легкий Путь

если вы типичный разработчик, вы можете установить простой способ, используя инструкции на 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 Multiple-precision C. Это зависит от 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 означает исполняемый и связываемый формат. Эта библиотека обеспечивает архитектурно-независимый размер и поддержку 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-это коллекция компиляторов 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 и ее флаги должны быть все в одной командной строке (это сообщение показывает их на отдельных строках только из-за ширины веб-страницы).

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

The весь процесс должен быть не сложнее, чем этот (замена 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

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

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

Я выбрал второй и построил gcc, g++ и gfortran.

Я построил все в

PREFIX=$HOME/cmp/soft/sft

и make I используется

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  ]; then
        case  in
            *.tar.bz2)   tar xvjf     ;;
            *.tar.gz)    tar xvzf     ;;
            *.bz2)       bunzip2      ;;
            *.rar)       unrar x      ;;
            *.gz)        gunzip       ;;
            *.tar)       tar xvf      ;;
            *.tbz2)      tar xvjf     ;;
            *.tgz)       tar xvzf     ;;
            *.zip)       unzip        ;;
            *.Z)         uncompress   ;;
            *.7z)        7z x         ;;
            *)           echo "I don't know how to extract ''..." ;;
        esac
    else
        echo "'' 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

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

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

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

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

ОДИН.

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

  • загрузите GCC-X. 0. 0-version (с последней версией от:https://gcc.gnu.org/)
  • извлеките gcc-X-000.смола.GZ файлы в расположение / somepath/.
  • после того, как вы добыли .смола.GZ file, run ./ contrib / download_prerequisites скрипт, который находится на /somepath/ или исходный каталог.
  • этот скрипт будет загружать библиотеки поддержки, в том числе: GMP, MPFR и MPC и создадим ссылки для вас это будет построить все зависимости gcc автоматически как часть процесса установки gcc.

    нет необходимости создавать и связывать библиотеки поддержки, которые были загружены в /somepath / путем выдачи Make, Make Install или работает ./настроить файл или добавление ссылок, таких как --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 или ./формировать. кроме того, процесс занимает несколько минут, чтобы завершить весь процесс.
  • теперь вы можете продолжить работу с 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. Это будет работать сделать одновременно в параллельный в зависимости от количества процессоров на вашем ПК или Mac.

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

Я последовал за верхним принятым ответом joelparkerhenderson. Это лучший ответ, который я мог найти для установки в системе *NIX через интернет.

для потомков я хочу добавить, что если вы получаете ошибку "ошибка установки: не удается вычислить суффикс объектных файлов: не удается скомпилировать"

затем обновите LD_LIBRBARY_PATH с помощью /tmp/gcc / lib (см. полный ответ joelparkerhenderson для контекста)

/tmp/gcc / lib содержит все необходимые файлы mpfr/mpc / gmp so и компоновщик времени выполнения не могут найти их, если вы не добавите их в LD_LIBRARY_PATH. Также не забудьте экспортировать LD_LIBRARY_PATH ;). Больше контекста здесь: https://gcc.gnu.org/wiki/FAQ#configure_suffix