Ошибка "неразрешенного включения" в Eclipse CDT для заголовков стандартной библиотеки C

Я установил CDT для Eclipse и написал простую программу на языке hello world C:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

Программа собирается и работает правильно, но затмение продолжает показывать этот желтый знак вопроса рядом с оператором включения, который говорит "Unresolved inclusion: <stdio.h>" когда я наведу на него мышь.

Это не влияет на работу программы, но я нахожу это довольно раздражающим.

У кого-нибудь есть идеи как его убрать?

12 ответов

Решение

Компилятор, который использует Eclipse, способен разрешать символы очень хорошо, поэтому код будет хорошо компилироваться.

Но Eclipse, использующий завершение кода / препроцессор, не знает, где существует stdio.h.

Вам необходимо указать путь к файловой системе, где находится stdio.h.

См. http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.cdt.doc.user/tasks/cdt_t_proj_paths.htm

Я нашел эти ответы (включая принятый) несколько загадочными.

Для меня мне пришлось добавить путь, где расположен stdio.h (как сказал @ardnew). В Eclipse вы открываете свойства вашего проекта, раскрываете "C/C++ General" и выбираете "Paths and Symbols".

Убедитесь, что вы добавили include DIR для каждого языка, который вы используете. (В моем случае мне просто нужно было добавить его в GNU C++.)

Выберите "Проект"> "Свойства"> "Общие сведения о C/C++"> "Включает препроцессор"> "Поставщики" и выберите "Настройки встроенного компилятора CDT GCC" и "Настройки встроенного компилятора CDT CROSS GCC".

Просто добавив в базу знаний, я просто сделал это на win7 с Cygwin.

это то, что, кажется, работает для меня.

включить пути для c:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\usr\include

включить пути для C++:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++
D:\dev\cygwin\usr\include

это дает мне чистую компиляцию привет мира.

  • Выберите Файл >> Новый проект
  • В мастере проектов выберите C/C++>> C++ Project
  • В разделе "Тип проекта" выберите "Проект Makefile >> Проект Hello world C++"
  • В разделе "Наборы инструментов" выберите "Linux GCC"

Это может решить проблему. (Извините за плохой английский)

Как отмечают (текущие) топ-ответы, необходимо указать, где расположены папки сборки, что можно добавить с помощью диалогового окна, щелкнув правой кнопкой мыши по проекту и выбрав Свойства->C/C++ Общие-> Пути и символы.

Остается вопрос, какие пути нужно добавить.

Если вы кросс-компилируете или делаете что-то необычное, вы, вероятно, знаете, какие пути вам нужны и в каком порядке (или посмотрите документацию для вашего компилятора и / или другие зависимости).

Для тех, кто ищет основы: если у вас правильно настроен gcc для доступа из командной строки, и вам нужно знать, какие пути по умолчанию включают пути, которые он использует, просто спросите его.

В зависимости от того, какой язык вас интересует, используйте:

gcc -x c -v -E /dev/null
gcc -x c++ -v -E /dev/null

... в этом списке будут перечислены параметры компилятора по умолчанию, которые используются при вызове gcc (и эта команда также работает, если "gcc" действительно является псевдонимом для clang, как в OSX).

Обратите внимание, что в Windows /dev/null это просто сокращение для входного файла (без необходимости его создания).

Внизу будет список включаемых каталогов:

#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.

Если вы введете перечисленные здесь каталоги в указанном порядке в диалоговое окно путей и символов Eclipse, Eclipse CDT сможет найти стандартные заголовки и, возможно, некоторые дополнительные заголовки, специфичные для вашей ОС.

(Благодаря ответу Devnull на связанный вопрос.)

Я работаю с несколькими конфигурациями кросс-компилятора, где мне нужно использовать разные места для заголовочных файлов STD (и других переменных среды).

Решением было настроить индексатор так, чтобы он использовал активную конфигурацию.
К сожалению, из-за некоторой ошибки в eclipse, опция не сохраняется локально, поэтому вам нужно использовать конфигурацию рабочей области, если вы хотите сохранить конфигурацию при повторном открытии eclipse.

Окно -> Настройки -> C/C++ -> Индексатор -> Использовать активную конфигурацию сборки

Это заставит eclipse использовать правильный компилятор, который установлен с активной конфигурацией Cross GCC проекта.

Я использую Eclipse с Cygwin, и это сработало для меня:

Выберите "Проект"> "Свойства"> "Общие сведения о C/C++"> "Препроцессор включает в себя..."> "Поставщики" и выберите "Параметры встроенного компилятора CDT GCC Cygwin [Shared]".

В ADT я сделал следующее:

  1. щелкните правой кнопкой мыши на проекте и выберите Свойства
  2. разверните C/C++ General и выберите Preprocessor Include Paths, Macros и т. д.
  3. выберите CDT User Setting Entries
  4. выберите Добавить... из меню справа
  5. В поле "Добавить каталог" измените путь проекта к пути файловой системы
  6. Перейдите в каталог, содержащий ваши файлы включения
  7. перемешать и повторить по мере необходимости

Обычно Eclipse должен иметь возможность автоматически разрешать стандартные включаемые файлы. Это делается путем вызова gcc и запроса его конфигурации. Скорее всего, Eclipse не находит ваш gcc (или, по крайней мере, не версию, которую вы используете для компиляции).

Вместо того, чтобы указывать все стандартные пути включения в настройках проекта, вы, вероятно, захотите убедиться, что Eclipse находит gcc. Добавьте каталог, в котором находится gcc, в переменную среды PATH перед запуском Eclipse.

Если вы хотите, чтобы в разных проектах использовались разные компиляторы, вы можете настроить параметры обнаружения. По умолчанию они скрыты, поэтому сначала включите их в меню "Окно"> "Установки"> "C/C++"> "Настройки страниц свойств"> "Страница параметров поиска". Затем вы можете найти их в C/C++ Build > Discovery Options в свойствах проекта.

Я использую основанную на затмениях среду разработки CodeWarrior для встроенных проектов, и я только что решил эту проблему, удалив и снова добавив исходные адреса в свойства проекта -> Общие сведения о C/C++ -> Путь и символы -> Включить каталоги. Это означает, что есть много причин, чтобы принять сообщение "Неразрешенное включение:", а также много решений.

При настройке путей и символов у меня возникла ошибка: изначально я настроил пути включения для другого языка. Я работаю с CDT и Cygwin GNU C++. Таким образом, вы должны настроить символы и пути на языке GNU C++.

Также установите ${COMMAND} к gcc в Linux

Под:

  • Проект
  • Свойства
  • C/C++ Общие
  • Препроцессор включает пути, макросы и т. Д.
  • Провайдеры
  • CDT GCC Встроенные настройки компилятора
  • Команда для получения спецификаций компилятора

Заменить:

${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"

с:

gcc -std=c99 -E -P -v -dD "${INPUTS}"

Если вы этого не сделаете, стандартный вывод Eclipse покажет:

Unable to find full path for "-E"

и журналы под ${HOME}/eclipse-workspace/.metadata/.log Показать:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

потому как ${COMMAND} ${FLAGS} пусты, поэтому Eclipse пытается выполнить -E что будет дальше.

Интересно, сможем ли мы правильно определить COMMAND а также FLAGS переменные в настройках, но я попытался добавить их как переменные сборки, и это не сработало.

Версия вопроса для C++: как решить проблему "Неразрешенное включение: " в файле C++ в Eclipse CDT?

Протестировано на Eclipse 2020-03 (4.15.0), Ubuntu 19.10 и этом минимальном проекте Makefile с существующими исходными кодами.

Вы проверяете, компилируется ли он из командной строки? Мне помогает в Linux, apt install libc-dev.

Другие вопросы по тегам