Я пытаюсь установить несколько версий компилятора g ++ для тестирования.
Я хотел бы иметь возможность установить g++ 4.9.3
, 5.1.0
, 5.2.0
и 6.1.0
.
Я знаю, что могу выполнять
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y;
sudo apt-get update -qq
sudo apt-get install g++-4.9, g++5.1, g++5.2, g++6
, но в моих тестах все они заканчиваются использованием стандартной библиотеки, установленной системой, которая является стандартной библиотекой g++-4
-series. Я могу сказать, потому что когда я компилирую код, стандартная библиотека не делает некоторых вещей, которые стандарт C ++ 11 говорит, что это должно делать, например, конструктор перемещения std::string
не помечен noexcept
. Но на ubuntu-xenial, в котором есть стандартная библиотека gcc-6, это так, и другие связанные с этим проблемы решаются.
Я вижу, что есть пакеты с именем libstdc++-4.8-dev
, например, в репозитории ubuntu, но когда я устанавливаю более новые компиляторы, они, кажется, не используют их.
Я также знаю, что могу устанавливать компиляторы из исходного кода в моем домашнем каталоге, но их сборка занимает так много времени, что я, к сожалению, не могу сделать это в travis-ci
. В travis-ci время всех сборок истекает через час.
Есть ли простой способ настроить компиляторы, которые устанавливаются из ppa, на использование правильных версий стандартной библиотеки C ++, т. Е. Той, с которой они были выпущены, а не системы по умолчанию?
Есть ли простой способ, которым я могу установить двоичный файл компилятора со всеми связанными библиотеками в папку в моем домашнем каталоге, используя apt-get, который не включает сборку из исходного кода?
Я нашел эти инструкции , в которых говорится, что я могу использовать флаг -rpath
или файл спецификации, или настроить LD_LIBRARY_PATH
, но я не уверен в том, какие пути мне следует задавать. Другая проблема заключается в том, что это не просто динамический компоновщик, похоже, что компиляторы ubuntu-toolchain-r/test
также используют системные заголовки libstdc++
, поэтому мне нужно как-то это исправить.
Моя текущая стратегия заключается в том, чтобы просто загрузить архив с выпуском исходного кода и попытаться поработать с флагами конфигурации, пока я не найду способ собрать его за <60 минут. Как только я получу его для сборки, он будет находиться в моем каталоге «cache», поэтому будущие сборки моего проекта смогут получить образ за <1 минуту.
Функция «кэширования» доступна только при использовании travis-изображений с точной (12.04 LTS) ubuntu, поэтому я даже не могу использовать trusty здесь.
Моя строка конфигурации в настоящее время:
${GCC_SRC_DIR}/configure --prefix=${GCC_DIR} --disable-checking --enable-languages=c,c++ --disable-multilib --disable-bootstrap
Я делаю это в основном на основе инструкций этого парня .
Существует также старый отчет об ошибке , в котором упоминается об этом.
Опция --disable-checking
на самом деле не задокументирована, так что, возможно, она больше не существует. Опция --disable-bootstrap
задокументирована, надеюсь, она не позволит мне фактически собрать компилятор три раза , как описано здесь ... хотя я не уверен, насколько вероятно, что это сработает.
Я использую make -j2 --quiet
для фактической сборки после этого.
Теперь работаем с более длинной строкой:
${GCC_SRC_DIR}/configure --prefix=${GCC_DIR} --disable-checking --enable-languages=c,c++ --disable-multilib --disable-bootstrap --disable-libsanitizer --disable-libquadmath --disable-libgomp --disable-libssp --disable-libvtv --disable-libada --enable-version-specific-runtime-libs
Конфигурирование gcc-5.x: cd build-gcc-5.x/
../gcc-5.3.0/configure --prefix=/usr/local/gcc53 --program-suffix=53 --enable-languages=c,c++ --with-system-zlib --disable-multilib --disable-libstdcxx-pch
(Требует sudo apt install zlib1g-dev
, если --with-system-zlib
)
О "60 минутах ограничивают": можно выйти из терминала после того, как скажут 55 минут и только продолжатся позже make
.