Eclipse 3.7.0 Indigo с CDT показывает множество ложных ошибок компиляции
Я обновил свой Ubuntu до 11.10, а затем Eclipse также был обновлен до 3.7.0 Indigo с CDT 8.0.1
Тогда возникает следующая проблема:
![Eclipse errors]()
Я включил векторный заголовочный файл, но компилятор сказал, что Symbol 'vector' could not be resolved
. Я также определил #define int Comparable
, но Eclipse также сказал Symbol 'Comparable' could not be resolved
и т.д....
Хотя происходит множество ошибок, компиляция была успешно завершена!
Я пытался использовать g++ для компиляции кода, у него не было проблем.
Ответы
Ответ 1
Время от времени крах Eclipse, виртуальной машины или компьютера или даже просто долгих месяцев разработки начинает изнашивать стабильность рабочего пространства, где Eclipse хранит все.
Проверьте каталог <workspace dir>\.metadata
, чтобы получить представление о том, сколько Eclipse генерирует и хранит в вашей рабочей области. Каждый раз, когда вы добавляете плагин, обновляйте плагин, удаляйте плагин, который помещает и изменяет информацию в вашей рабочей области.
Доказательство того, что эта проблема обычно возникает сразу после обновления Eclipse. (В моем случае Индиго).
Самый простой способ исправить пылевое рабочее пространство - это использовать аргумент командной строки -clean
для исполняемого файла eclipse.exe.
Документация справки Eclipse сообщает нам, что делает эта команда:
если установлено значение "true", любые кэшированные данные, используемые базой OSGi и Время работы eclipse будет очищено. Это очистит используемые кэши для хранения исправления зависимостей пакетов и реестре расширения eclipse данные. Использование этой опции заставит eclipse повторно инициализировать эти кэша.
Существует три способа использования аргумента командной строки -clean
:
- Отредактируйте файл eclipse.ini, расположенный в нем, и добавьте его в качестве первого аргумента в первой строке.
- Отредактируйте ярлык, который вы используете для запуска Eclipse, и добавьте его в качестве первого аргумента.
- Создайте пакет или оболочку script, которая вызывает исполняемый файл Eclipse с аргументом
-clean
.
Преимущество шага 3 заключается в том, что вы можете поддерживать script и использовать его каждый раз, когда хотите очистить рабочую область.
Эта страница разрешила мне эту проблему! Надеюсь, это поможет всем.
Ответ 2
Проблема заключается в том, что существует множество каталогов include, отсутствующих в перспективе индексатора.
Добавление следующего сработало для меня, но может зависеть от вашей конкретной установки, где они на самом деле существуют:
/usr/include/c++/4.6.1
/usr/include/
/usr/include/c++
/usr/include/c++/4.6
/usr/include/x86_64-linux-gnu
/usr/include/asm-generic
/usr/include/c++/4.6.1/x86_64-linux-gnu/
Их можно установить в Project>Properties>C++ Include Paths
Предположительно, в будущем специализация платформы для CDT будет автоматически включаться. Я помню, что читал это где-то, но не могу предоставить ссылку.
Ответ 3
В свойствах проекта перейдите в C/С++ Build > Редактор цепочки инструментов, выберите "Только теги", совместимые с инструментами, и выберите "Linux GCC" и нажмите кнопку "Применить".
Теперь, если вы перейдете к C\С++ General > Paths and Symbols, вы увидите новый список включенных путей. Если вы перестроить индекс, сообщения об ошибках должны исчезнуть.
Ответ 4
Анализ кода вызывает это. Это не собственно компиляция кода, а просто выполнение некоторых статических проверок для быстрой обратной связи. К сожалению, я не знаю, как это исправить, я просто отключил его. Извините, что я на работе, поэтому у меня нет CDT передо мной, но я думаю, что это что-то вроде:
Window > Preferences > C++ General > Code Analysis
Перейдите туда и снимите все флажки, чтобы отключить его.
Ответ 5
Когда вы создаете проект на С++ (в моем случае из существующего кода), вы должны установить "Toolchain for Indexer Settings" для используемого вами компилятора ( "GNU Autotools Toolchains" в моем случае).
После этого "Путь и символы" покажет правильный путь к включенным файлам вашего компилятора.
Ошибки исчезнут.
Этот параметр был полезен только при создании проекта, установка которого позже не помогла.
В версии indigo 3.7.2 (и может быть) ваши изменения могут быть эффективными после переиндексации. Eclipse попросит "переиндексировать". В более низких версиях могут потребоваться ручные переиндексирующие теги заголовков и т.д.
Ответ 6
Обновленная опция индекса для активной конфигурации сборки работает для меня,
также я удалил некоторые файлы из списка файлов, которые были проиндексированы вверх,
Ответ 7
Хорошо, вот что сработало для меня:
-
удалил путь к файлам заголовков, которые я создал из пути include
-
скомпилировал проект (очевидно, компилятор жалуется, поскольку ему не хватает пользовательских заголовков)
-
повторно ввел путь к файлам заголовков, которые я создал
-
снова скомпилировал проект - отлично работал
Я не могу объяснить случай: (
Ответ 8
Я отвечаю здесь, потому что это самый близкий вопрос к моей проблеме.
Я использовал интеграцию QT Eclipse с Helios (3.6.2) без серьезных проблем. Я использовал mingw 4.6.2, который я установил для c:\mingw. Я хотел перейти на Indigo, в котором исправлены некоторые незначительные проблемы, с которыми я столкнулся с CDT.
Однако под Indigo (3.7 SR2) Eclipse начал подчеркивать тривиальные функции как нерешенные, такие как:
function 'fprintf' could not be resolved
function 'memset' could not be resolved
хотя #include не был подчеркнут, может быть открыт и включен fprintf в заголовке. И хотя сам код скомпилирован.
Если бы я вернулся к Гелиосу, проблемы исчезли.
Я пробовал переиндексировать, но безрезультатно. Я проверил мои включенные пути, и они были:
c:\mingw\include
C:\MinGW\lib\gcc\mingw32\4.6.2\include
Сначала я только что включил первый, но не второй. Но затем я искал "неразрешенные включил", и stdio.h включал stdarg.h, который не был в основной включенной папке mingw, поэтому я добавил вторую. Но, тем не менее, printf не был разрешен, и больше не было "неразрешенных включений".
Я создал новый проект на С++ с одним классом. Я добавил stdio.h, пути выше и вызов fprintf. Это было подчеркнуто! Хотя другие вещи из stdio не были подчеркнуты.
Теперь я знал, что это не просто проблема Qt.
Я работал над этим некоторое время, прежде чем я прочитал нижний пост, предлагая удалить пути включения и компиляцию. Я не верил, что это сработает, но выстрелил. Удивительно, хотя компиляция не удалась, ошибка исчезла!
Тогда я снова взглянул на включенные пути. Они были обновлены на этапе компиляции следующим образом:
c:/mingw/lib/gcc/mingw32/4.6.2/include-fixed
c:/mingw/include
c:/mingw/lib/gcc/mingw32/4.6.2/include
c:/mingw/lib/gcc/mingw32/4.6.2/include/c++/backward
c:/mingw/lib/gcc/mingw32/4.6.2/include/c++/mingw32
c:/mingw/lib/gcc/mingw32/4.6.2/include/c++
Они были отмечены как "встроенные" значения, которые я предполагаю, что они не были добавлены мной и могут быть обновлены при следующем запуске сборки.
Итак, я думаю, что урок есть, включая каждый отдельный путь include под mingw, даже если Eclipse не находит его неразрешенным.
Следующим шагом было поместить все эти пути в мой проект Qt. К сожалению, после этого остались нерешенные функции. Похоже, что это какая-то ошибка с путями Qt C/С++, которые отличаются от CDT C/С++, включая пути.