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


96

Я настроил CDT для eclipse и написал простую программу C hello world:

#include <stdio.h>

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

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

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

Кто-нибудь знает, как его удалить?


2
Вы могли бы подумать, что пример Hello World сделает это за вас или, по крайней мере, поможет. Если в eclipse нет компилятора, почему нет?
Doug Molineux

Ответы:


50

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

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

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

Документация Eclipse описывает это в нескольких разделах для компилятора:

И если автозавершение кода / индексатор или препроцессор также не могут найти stdio.h:

Точное расположение stdio.hбудет зависеть от системы, для которой вы собираетесь писать код. Если вы пишете код для той же системы, в которой работаете Eclipse, то стандартное расположение - /usr/include/stdio.hдля Linux, macOS, Cygwin и т. Д.

Если вы выполняете кросс-компиляцию для отдельной / удаленной целевой системы (например, Android, Raspberry Pi, STM32), она будет находиться где-то в SDK, который вы установили для этой системы. Вам нужно будет обратиться к этой конкретной документации SDK.


2
Спасибо за ответ. Но где же путь к Ubuntu 11.10?
Деррик Чжан,

Одна вещь, которая меня смутила, заключалась в том, что мне пришлось добавить путь на вкладку «включает», а не на вкладку «пути к библиотекам». Я всегда думал, что «угловая скоба» включает в себя «библиотеку».
aaaidan

1
Вы указываете, где искать файлы заголовков (т.е. файлы .h) на вкладке «Включаемые». Вы указываете компоновщику, где он может найти файлы скомпилированной библиотеки на вкладке пути к библиотеке. Соглашение о кавычках и угловых скобках, вероятно, зависит от компилятора, но я всегда думаю, что <> означает сначала искать в месте стандартной системной библиотеки, а "" означает сначала искать в моем проекте.
Tod

2
Современные компиляторы не делают различий между кавычками и угловыми скобками. Обычно стандартные системные заголовки по-прежнему помещаются в угловые скобки.
Сеппо Энарви,

53

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

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

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

введите описание изображения здесь


Это очень близко к тому, что мне было нужно! Просто пришлось изменить имя пользователя в пути.
Лукас

2
В OS X вам может потребоваться вручную установить инструменты разработчика командной строки (для чего сначала требуется установка Xcode) с помощью команды, /usr/bin/xcode-select --installа затем вы сможете указать Eclipse на/usr/include/
RobV

1
На Йосемити. Использование Eclipse Juno. Это сработало для меня, за исключением того, что путь, который я указал, был немного другим (/ Users / SrinivasanNatarajan / android-ndk / platform / android-19 / arch-arm / usr / include). Несмотря на то, что все нерешенные ошибки исчезли, я все еще сомневаюсь, что «правильно ли я выбрал путь». «Затмение действительно отстой». Пришлось потратить часы на настройку IDE для разработки.
Srinivasan N

1
Спасибо. Мне помог только ваш вариант.
Nikmoon

В моем случае (с MinGW) я использовал «Файловая система ...» для добавления каталога «C: \ MinGW \ include»
Gary99

17

просто добавляя в базу знаний, я только что сделал это на 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

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


Я из будущего. Я пришел поблагодарить тебя. На самом деле это первое, что у меня сработало. У меня никогда не было такого сложного приветственного мира. Спасибо, сэр.
nVentimiglia

17

Перейдите в Project> Properties> C / C ++ General> Preprocessor Includes> Providers и выберите оба:

  • «Настройки встроенного компилятора CDT GCC»
  • "Настройки встроенного компилятора CDT CROSS GCC"

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

Протестировано на Eclipse 4.8.0 в Ubuntu 16.04 с C и C ++ hello world.


3
... и установите флажок "Использовать глобального поставщика, совместно используемого проектами"
Urhixidur

Мне также пришлось проверить "Использовать глобального поставщика, совместно используемого между проектами", как упоминал @Urhixidur. Я пробовал большое количество решений этой встроенной ошибки eclipse, и это то, что действительно сработало для меня. Эти строки раздражали. Спасибо!
CodeGuyRoss

10
  • Выбрать Файл >> Новый проект.
  • В мастере проектов выберите C / C ++ >> Проект C ++.
  • В разделе «Тип проекта» выберите « Проект Makefile >> Проект Hello world C ++. ».
  • В разделе «Toolchains» выберите « Linux GCC ».

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


1
Я делал то же самое, но он все еще не распознал, что заголовки находятся в / usr / include.
Cardiff Space Man

Намного проще, чем добавлять каждое отдельное включение. Я использовал опцию cross plattform, которая также хорошо работала (на Ubuntu)
panmari

Очень полезно! Отличный английский.
AturSams

Как это сделать в существующем проекте?
Джей Элстон

4

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

Перейдите в Project> Properties> C / C ++ General> Preprocessor Includes ...> Providers и выберите «CDT GCC Built-in Compiler Settings Cygwin [Shared]».


4

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

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

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

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


Была такая же проблема, кросс-компиляция с ESP8266. Жаль, что эта страница так переполнена, что пришлось разобраться самому.
Михаэль Бёклинг,

Спасибо тебе за это. У меня также возникла эта проблема после того, как я создал несколько конфигураций кросс-компилятора (для разных версий встроенного SDK ESP32 «ESP-IDF»). Индексатор не принял правильные заголовки. Этот параметр, похоже, позволяет индексатору использовать ту же среду, что и активная конфигурация, что в моем случае позволило ему выбрать правильные заголовки.
davidA

3

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

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

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

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

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

/dev/null используется как пустой файл - мы говорим gcc проанализировать пустой файл

-x <language> указывает язык для компиляции, необходимый, потому что мы не используем файл с расширением, указывающим язык

-v подробный вывод, который включает вывод включаемых путей

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

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

#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 на связанный вопрос.)


Действительно ОЧЕНЬ полезно.
sancho.s ReinstateMonicaCellio

1

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

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

1

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

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

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


1

Я использую IDE CodeWarrior на основе eclipse для встроенных проектов, и я только что решил эту проблему, удалив и снова добавив исходные адреса в Project Property-> C / C ++ General-> Path и Sybols-> Include Directories. Это означает, что есть много причин для вывода сообщения «Неразрешенное включение:», а также множество решений.


0

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


0

Также установлен ${COMMAND}в gccLinux

Под:

  • Проект
  • Свойства
  • 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 ++: как решить проблему «Неразрешенное включение: <iostream>» в файле C ++ в Eclipse CDT?

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.