gcc: ошибка проверки целостности, предположительно из-за отсутствия флага USE cxx

Вопрос или проблема

Недавно я выполнил emerge -e world и обнаружил, что gcc был скомпилирован без флага cxx. Теперь я не могу скомпилировать ни один пакет C++, так как

configure: error: C++ preprocessor "/lib/cpp" fails sanity check

Я подумываю скопировать файлы, возвращаемые командой equery f gcc|grep -v share
из stage3. Поможет ли это? Есть ли более простой способ?

ОБНОВЛЕНИЕ 1
Вот мой config.log

ОБНОВЛЕНИЕ 2
Вот мой make.conf
Обратите внимание, что в USE есть флаг cxx. Я добавил его недавно, но это не помогает, так как я не могу пересобрать пакеты.

ОБНОВЛЕНИЕ 3 Я пытался переустановить gcc-4.6.3 из бинарного пакета через

emerge -avK gcc:4.6

Установка завершилась успешно, но ошибка не исчезла.

Также я заметил, что:

configure:11955: /lib/cpp  conftest.cpp
cpp: error: conftest.cpp: C++ compiler not installed on this system
configure:11955: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "expat"
| #define PACKAGE_TARNAME "expat"
| #define PACKAGE_VERSION "2.1.0"
| #define PACKAGE_STRING "expat 2.1.0"
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| /* end confdefs.h.  */
| #ifdef __STDC__
| # include <limits.h>
| #else
| # include <assert.h>
| #endif
|                    Syntax error

Похоже, что он утверждает, что компилятор C++ не установлен в моей системе. Но это звучит как ерунда, так как gcc:4.6 был установлен из бинарного пакета, и я предполагаю, что он скомпилирован с поддержкой C++.

ОБНОВЛЕНИЕ 4 Действительно, есть проблема с g++

uhradio ~ # g++ queue.cpp 
gcc-config: error: could not run/locate 'g++'
uhradio ~ # cpp queue.cpp 
cpp: error: queue.cpp: C++ compiler not installed on this system

Вывод команды gcc-config -l:

[1] x86_64-pc-linux-gnu-4.6.3 *

Это вероятно то, что вам нужно. Короче говоря, установите заголовки ядра, и у вас все будет в порядке.

Хотя emerge -avK gcc:4.6 не помог, я вручную извлек gcc-4.6.3.tbz2 в директорию /, затем установил gcc-config 1 и это помогло (хотя моя /usr/lib пропала после этой операции, я вручную создал символическую ссылку обратно на /usr/lib64. Теперь я пересобираю оба gcc (4.5 и 4.6) с флагом cxx.

Теперь мой вопрос изменился на другой. В чем причина того, что флаг cxx пропал из моей системы, собранной из stage3? Я устанавливаю gentoo linux уже много лет и никогда не устанавливал флаг cxx явно, как сейчас.

Ответ или решение

Ошибка компиляции gcc: проблема с флагом cxx и решение

Недавнее выполнение команд emerge -e world привело к тому, что gcc был скомпилирован без флага USE cxx, что стало причиной проблем при компиляции любых C++ пакетов. При попытке скомпилировать пакет, вы получили сообщение об ошибке:

configure: error: C++ preprocessor "/lib/cpp" fails sanity check

Эта ошибка связана с тем, что C++ компилятор, а именно g++, не был должным образом установлен или настроен на вашей системе, что подтверждается строкой:

cpp: error: conftest.cpp: C++ compiler not installed on this system

Причины проблемы:

  1. Отсутствие флага cxx: При установке Gentoo Linux, флаг USE cxx отвечает за поддержку компиляции C++ кода. Если этот флаг не установлен, gcc будет собран без поддержки C++, в результате чего g++ и другие инструменты C++ не будут доступны.

  2. Проблемы с конфигурацией: Возможно, в make.conf флаг cxx был неактивен на момент сборки, что и привело к этой проблеме.

  3. Неправильная установка или конфигурация gcc: Если gcc был переустановлен из бинарного пакета, это не всегда гарантирует, что он будет оптимально настроен для вашей системы, особенно если вы изменяете флаги USE после установки.

Решения:

  1. Проверка и добавление флага cxx в make.conf:
    Убедитесь, что в файле /etc/portage/make.conf присутствует флаг cxx в строке USE. Например:

    USE="cxx"
  2. Пересборка gcc:
    После добавления флага cxx, вам необходимо пересобрать gcc. Используйте команду:

    emerge -av gcc

    Это обеспечит поддержку C++ в вашем gcc.

  3. Использование gcc-config:
    Выполните команду gcc-config для переключения между установленными версиями gcc, если у вас их несколько:

    gcc-config -l
    gcc-config <номер версии>
  4. Установите необходимые пакеты:
    Иногда отсутствие заголовков ядра может вызвать подобные проблемы. Убедитесь, что пакет с заголовками ядра установлен:

    emerge sys-kernel/gentoo-sources
  5. Проверка конфигурации g++:
    Убедитесь, что g++ доступен и корректно ссылается на gcc. Попробуйте выполнить команду:

    g++ --version

    Если возникает ошибка, выполните пересборку соответствующих пакетов.

Заключение:

На основании вышеизложенного, исправление проблемы с отсутствием компилятора C++ на вашей системе потребует пересборки gcc с флагом USE cxx. Это эффективный и правильный путь для решения текущих проблем с компиляцией. Учтите, что использование бинарных пакетов не всегда обеспечивает оптимальную конфигурацию для вашей системы, особенно в Gentoo, где сильно зависят от флагов USE.

Также возможно, что флаг cxx мог быть удален или неактивен после обновления пакетных настроек. Рекомендуется регулярно проверять и обновлять ваши флаги USE, чтобы избежать подобных проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...