Ошибка "неразрешенного включения" в 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 я сделал следующее:
- щелкните правой кнопкой мыши на проекте и выберите Свойства
- разверните C/C++ General и выберите Preprocessor Include Paths, Macros и т. д.
- выберите CDT User Setting Entries
- выберите Добавить... из меню справа
- В поле "Добавить каталог" измените путь проекта к пути файловой системы
- Перейдите в каталог, содержащий ваши файлы включения
- перемешать и повторить по мере необходимости
Обычно Eclipse должен иметь возможность автоматически разрешать стандартные включаемые файлы. Это делается путем вызова gcc и запроса его конфигурации. Скорее всего, Eclipse не находит ваш gcc (или, по крайней мере, не версию, которую вы используете для компиляции).
Вместо того, чтобы указывать все стандартные пути включения в настройках проекта, вы, вероятно, захотите убедиться, что Eclipse находит gcc. Добавьте каталог, в котором находится gcc, в переменную среды PATH перед запуском Eclipse.
Если вы хотите, чтобы в разных проектах использовались разные компиляторы, вы можете настроить параметры обнаружения. По умолчанию они скрыты, поэтому сначала включите их в меню "Окно"> "Установки"> "C/C++"> "Настройки страниц свойств"> "Страница параметров поиска". Затем вы можете найти их в C/C++ Build > Discovery Options в свойствах проекта.
Я использую основанную на затмениях среду разработки CodeWarrior для встроенных проектов, и я только что решил эту проблему, удалив и снова добавив исходные адреса в свойства проекта -> Общие сведения о C/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++: как решить проблему "Неразрешенное включение:
Протестировано на Eclipse 2020-03 (4.15.0), Ubuntu 19.10 и этом минимальном проекте Makefile с существующими исходными кодами.
Вы проверяете, компилируется ли он из командной строки? Мне помогает в Linux, apt install libc-dev.