Помилка "Невирішено включення" із CDT Eclipse для стандартних заголовків бібліотеки C.


96

Я створив CDT для затемнення і написав просту програму привіт, світ С:

#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-файли) на вкладці "Включає". Ви повідомляєте лінкеру, де він може знайти скомпільовані файли бібліотеки на вкладці шлях до бібліотеки. Домовленість між лапками та кутовими дужками, ймовірно, залежить від компілятора, але я завжди вважаю <> значенням, яке спочатку виглядає в стандартній системній бібліотеці, а "" як сенсом спочатку шукати в моєму проекті.
Тод,

2
Сучасні компілятори не розрізняють лапки та кутові дужки. Звичайно стандартні системні заголовки все ще розміщуються в кутових дужках.
Seppo Enarvi

53

Я знайшов ці відповіді (включаючи прийняту) дещо загадковими.

Для мене мені довелося додати шлях, де знаходиться stdio.h (як сказав @ardnew). У Eclipse ви відкриваєте Властивості свого проекту, розгортаєте "C / C ++ General" і вибираєте "Шляхи та символи".

Переконайтеся, що ви додали includeкаталог для кожної мови, якою ви користуєтесь. (У моєму випадку мені потрібно було просто додати його до GNU C ++.)

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


Це моторошно близько до того, що мені було потрібно! Просто довелося змінити ім'я користувача у шляху.
Лукас

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

1
На Йосеміті. Використання Eclipse Juno. Цей вид роботи працював у мене, за винятком того, що шлях, який я дав, був дещо іншим (/ Users / SrinivasanNatarajan / android-ndk / платформи / 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

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


Я з майбутнього. Я прийшов сказати спасибі. Це насправді перше, що мені вдалося. У мене ніколи не було такого важкого привітного світу. Дякую вам сер.
nVentimiglia

17

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

  • "Вбудовані налаштування компілятора CDT GCC"
  • "Вбудовані налаштування компілятора CDT CROSS GCC"

Для кожного з них також виберіть підпункт: "Використовувати глобального постачальника, спільного використання між проектами".

Протестовано на Eclipse 4.8.0 в Ubuntu 16.04 з C і C ++ привіт світ.


3
... і поставте прапорець
біля пункту

Мені довелося також перевірити "Використовувати глобального провайдера, спільно використовуваного між проектами", як згадував @Urhixidur. Я спробував велику кількість рішень для цієї вбудованої помилки затемнення, і це те, що насправді спрацювало для мене. Ці рядки дратували. Дякую!
CodeGuyRoss

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

Це може вирішити проблему. (Вибачте за погану англійську)


1
Я робив ці речі, але він все ще не визнавав, що заголовки знаходяться в / usr / include.
cardiff space man

Набагато простіше, ніж додавання кожного, включайте себе. Я використовував варіант крос-платформи, який також добре працював (на 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"). Правильні заголовки Indexer не підібрав. Здається, це налаштування дозволяє Indexer використовувати те саме середовище, що і активна конфігурація, що в моєму випадку дозволило йому підібрати правильні заголовки.
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 тощо.
  3. виберіть CDT User Setting Entries
  4. виберіть Додати ... з меню праворуч
  5. У розділі "Додати включити каталог" змініть шлях проекту до шляху файлової системи
  6. Перейдіть до каталогу, що містить ваші файли включення
  7. перемішати і повторити за потреби

1

Зазвичай Eclipse повинен мати можливість автоматично вирішувати стандартні файли включення. Він робить це, викликаючи gcc і запитуючи його конфігурацію. Швидше за все Eclipse не знаходить ваш gcc (або, принаймні, не ту версію, яку ви використовуєте для компіляції).

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

Якщо ви хочете, щоб різні проекти використовували різні компілятори, можливо, ви захочете налаштувати параметри виявлення. Вони за замовчуванням приховані, тому спочатку увімкніть їх у вікні> Налаштування> C / C ++> Параметри сторінок властивостей> Відобразити сторінку «Параметри виявлення». Потім ви можете знайти їх у розділі C / C ++ Build> Discovery Options у властивостях проекту.


1

Я використовую CodeWarrior IDE на основі eclipse для вбудованих проектів, і я щойно вирішив цю проблему, видаливши та додавши знову джерельні адреси до Project Properties -> C / C ++ General-> Path and Sybols-> Include Directories. Це означає, що є багато причин приймати повідомлення "Невирішене включення:", і є також багато рішень.


0

Помилка під час налаштування шляхів та символів полягає в тому, що спочатку я налаштував шляхи включення для іншої мови. Я працюю з CDT та Cygwin gnu C ++. Отже, ви повинні налаштувати символи та шляхи на мові GNU C ++.введіть тут опис зображення


0

Також встановлено , ${COMMAND}щоб gccна Linux

Під:

  • Проект
  • Властивості
  • C / C ++ Загальні
  • Препроцесор включає шляхи, макроси тощо.
  • Постачальники
  • Налаштування компілятора CDT GCC
  • Команда для отримання специфікацій компілятора

Замінити:

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

з:

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

Якщо ви цього не зробите, у Eclipse stdout буде показано:

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наступне.

Цікаво, чи зможемо ми правильно визначити COMMANDFLAGS змінні and у налаштуваннях, але я намагався додати їх як змінні побудови, і це не спрацювало.

C ++ версія запитання: Як вирішити "невирішене включення: <iostream>" у файлі C ++ у Eclipse CDT?

Протестовано на Eclipse 2020-03 (4.15.0), Ubuntu 19.10 та на цьому мінімальному проекті Makefile із наявними джерелами .


0

Ви перевіряєте, чи компілюється з командного рядка? Мені допомагає Linux, apt встановити libc-dev.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.