Вопрос или проблема
Недавно я выполнил 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
Причины проблемы:
-
Отсутствие флага cxx: При установке Gentoo Linux, флаг USE
cxx
отвечает за поддержку компиляции C++ кода. Если этот флаг не установлен,gcc
будет собран без поддержки C++, в результате чегоg++
и другие инструменты C++ не будут доступны. -
Проблемы с конфигурацией: Возможно, в
make.conf
флагcxx
был неактивен на момент сборки, что и привело к этой проблеме. -
Неправильная установка или конфигурация gcc: Если
gcc
был переустановлен из бинарного пакета, это не всегда гарантирует, что он будет оптимально настроен для вашей системы, особенно если вы изменяете флаги USE после установки.
Решения:
-
Проверка и добавление флага cxx в make.conf:
Убедитесь, что в файле/etc/portage/make.conf
присутствует флагcxx
в строке USE. Например:USE="cxx"
-
Пересборка gcc:
После добавления флагаcxx
, вам необходимо пересобратьgcc
. Используйте команду:emerge -av gcc
Это обеспечит поддержку C++ в вашем
gcc
. -
Использование gcc-config:
Выполните командуgcc-config
для переключения между установленными версиямиgcc
, если у вас их несколько:gcc-config -l gcc-config <номер версии>
-
Установите необходимые пакеты:
Иногда отсутствие заголовков ядра может вызвать подобные проблемы. Убедитесь, что пакет с заголовками ядра установлен:emerge sys-kernel/gentoo-sources
-
Проверка конфигурации g++:
Убедитесь, чтоg++
доступен и корректно ссылается наgcc
. Попробуйте выполнить команду:g++ --version
Если возникает ошибка, выполните пересборку соответствующих пакетов.
Заключение:
На основании вышеизложенного, исправление проблемы с отсутствием компилятора C++ на вашей системе потребует пересборки gcc
с флагом USE cxx
. Это эффективный и правильный путь для решения текущих проблем с компиляцией. Учтите, что использование бинарных пакетов не всегда обеспечивает оптимальную конфигурацию для вашей системы, особенно в Gentoo, где сильно зависят от флагов USE.
Также возможно, что флаг cxx
мог быть удален или неактивен после обновления пакетных настроек. Рекомендуется регулярно проверять и обновлять ваши флаги USE, чтобы избежать подобных проблем в будущем.