Я пытаюсь скомпилировать современный GCC на Centos 6.4. Проблема в том, что Centos не имеет современного glibc, а GCC 4.8.x и 4.7.x продолжают выдавать мне следующую ошибку компиляции:
... -DL_gcov -c ../../.././libgcc/libgcov.c
In file included from /usr/include/features.h:385:0,
from /usr/include/stdio.h:28,
from ../../.././libgcc/../gcc/tsystem.h:88,
from ../../.././libgcc/libgcov.c:29:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
Проблема здесь в gnu/stubs-32.h
является частью современного glibc
а в Centos 6.4 его, похоже, нет. Я пробовал построить свой собственный glibc
но как только он будет установлен и в моем локальном LD_LIBRARY_PATH
Я не могу запускать никакие другие программы, потому что все существующие исполняемые файлы в системе пытаются связать их с ней, и они терпят неудачу.
Я хочу использовать новый компилятор, потому что он значительно лучше обрабатывает код C ++ STL, а также потому, что оптимизатор в GCC 4.8 заставляет мой код выполняться вдвое быстрее, чем компилятор GCC 4.4.7, который поставляется с Centos.
Есть предложения, как это сделать?
Ах, добро пожаловать в удовольствие от супер устаревших библиотек. Я столкнулся с аналогичными проблемами, и нашим решением было скомпилировать вторую версию GLIBC и явно использовать ее при запуске программного обеспечения.
Мне нужно было сделать это только на CentOS 5, так что вы можете обойтись более высокими версиями программного обеспечения, чем я упоминаю.
Вам нужно будет собрать GLIBC следующим образом:
CFLAGS='-march=i686 -O2' ../configure --prefix=/home/glibc215 \
make -j 4 && make install
(Я использовал GLIBC 2.15, аналогичные команды должны работать с более новыми версиями)
После его создания запустите приложение вручную примерно так:
/home/glibc215/lib/ld-linux.so.2 --library-path /home/glibc215/lib/:. /bin/bash
Все будет еще больше усложняться тем фактом, что вам нужна современная версия GCC. У меня нет подходящего решения для вас, вам нужно будет поиграться с запуском других версий glibc, чтобы ваш новый gcc собрался правильно.
Соберите компилятор gcc на вашем Centos и настройте его только на 64 бита.
Отрывок из документация:
Стандартная библиотека C и заголовки Для сборки GCC стандартная библиотека C и заголовки должны присутствовать для всех целевых вариантов, для которых будут построены целевые библиотеки (а не только для варианта компилятора C ++ хоста). Это влияет на популярную платформу «x86_64-unknown-linux-gnu» (среди других мультибиблиотечных целей), для которой 64-битные («x86_64») и 32-битные («i386») заголовки libc обычно упаковываются отдельно. Если вы выполняете сборку собственного компилятора на x86_64-unknown-linux-gnu, убедитесь, что у вас правильно установлен 32-разрядный пакет разработчика libc (точное имя пакета зависит от вашего дистрибутива), либо вы должны собрать GCC как 64-разрядный компилятор, настроенный с параметром --disable-Multilib. В противном случае вы можете столкнуться с такой ошибкой, как «фатальная ошибка: gnu / stubs-32.h: нет такого файла».
Вы можете установить более новую версию glibc в ~/lib
и установите gcc в ~/bin
и связывание с более новым glibc. Я бы посоветовал использовать это только для вашего приложения, которое работает на суперкомпьютере, и связать все (включая libc) статически, чтобы избежать большего беспорядка, чем вам придется для этого сделать.
Это не особенно изящное / элегантное решение, но оно может просто выполнять свою работу. Я сделал нечто подобное много лет назад, когда возился с ld.so и не хотел портить всю систему :-)