Ошибка «Неразрешенное включение» в 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.

Ardnew
источник
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]».

superm0
источник
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. перемешайте и повторите по мере необходимости
user330844
источник
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.

Ян Би Нуар
источник