Błąd „Nierozwiązane włączenie” z nagłówkami biblioteki standardowej Eclipse CDT dla C.


96

Skonfigurowałem CDT dla eclipse i napisałem prosty program hello world w C:

#include <stdio.h>

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

Program buduje się i działa poprawnie, ale zaćmienie wciąż wyświetla ten żółty znak zapytania obok wyrażenia włączenia, które mówi, "Unresolved inclusion: <stdio.h>"kiedy najeżdżam na niego myszą.

Nie wpływa to na działanie programu, ale jest raczej denerwujące.

Czy ktoś ma pomysł, jak to usunąć?


2
Można by pomyśleć, że przykład Hello World zrobi to za Ciebie lub przynajmniej zapewni pomoc. Jeśli eclipse nie zawiera kompilatora, dlaczego go nie ma?
— Doug Molineux

Odpowiedzi:


50

Kompilator używany przez Eclipse jest w stanie poprawnie rozwiązać symbole, więc kod będzie dobrze się skompilował.

Ale uzupełnianie kodu / indeksator lub preprocesor używany przez Eclipse nie wie, gdzie stdio.histnieje.

Musisz określić ścieżkę systemu plików, w której stdio.hsię znajduje.

Dokumentacja Eclipse opisuje to w kilku sekcjach dotyczących kompilatora:

A jeśli uzupełnianie kodu / indeksator lub preprocesor w szczególności nie może również zlokalizować stdio.h:

Dokładna lokalizacja stdio.hbędzie zależała od systemu, dla którego zamierzasz napisać kod. Jeśli piszesz kod dla tego samego systemu, na którym używasz Eclipse, standardowa lokalizacja to /usr/include/stdio.hLinux, macOS, Cygwin itp.

Jeśli kompilujesz krzyżowo dla oddzielnego / zdalnego systemu docelowego (np. Android, Raspberry Pi, STM32), zostanie on zlokalizowany gdzieś w SDK, który zainstalowałeś dla tego systemu. Będziesz musiał odwołać się do tej konkretnej dokumentacji SDK.


2
Dziękuję za odpowiedź. Ale gdzie jest ścieżka do Ubuntu 11.10?
— Derrick Zhang

Jedną rzeczą, która mnie zdezorientowała, było to, że musiałem dodać ścieżkę do karty „zawiera” zamiast karty „ścieżki bibliotek”. Zawsze myślałem, że dołączenia „w nawiasach kątowych” były dołączeniami „biblioteki”.
— aaaidan

1
Możesz określić, gdzie znaleźć pliki nagłówkowe (np. Pliki .h) na karcie dołączenia. Informujesz konsolidatora, gdzie może znaleźć skompilowane pliki bibliotek na karcie ścieżki biblioteki. Konwencja cudzysłowów w stosunku do nawiasów ostrych jest prawdopodobnie zależna od kompilatora, ale zawsze myślę o <> jako znaczeniu, które najpierw należy szukać w standardowym miejscu biblioteki systemowej, a "" jako oznaczające, że najpierw szuka się w moim projekcie.
— Tod

2
Nowoczesne kompilatory nie rozróżniają cudzysłowów i nawiasów ostrych. Tradycyjnie standardowe nagłówki systemowe są nadal umieszczone w nawiasach kątowych.
— Seppo Enarvi

53

Uznałem te odpowiedzi (w tym zaakceptowaną) za nieco tajemnicze.

Dla mnie musiałem dodać ścieżkę, w której znajduje się stdio.h (jak powiedział @ardnew). W Eclipse otwierasz Właściwości swojego projektu, rozwijasz „C / C ++ Ogólne” i wybierasz „Ścieżki i symbole”.

Upewnij się, że dodałeś includekatalog dla każdego języka, którego używasz. (W moim przypadku musiałem po prostu dodać go do GNU C ++.)

wprowadź opis obrazu tutaj


To jest niesamowicie bliskie temu, czego potrzebowałem! Musiałem tylko zmienić nazwę użytkownika w ścieżce.
— Lucas

2
W systemie OS X może być konieczne ręczne zainstalowanie narzędzi programistycznych wiersza poleceń (co najpierw wymaga zainstalowania Xcode) za pomocą polecenia, /usr/bin/xcode-select --installa następnie będziesz mógł wskazać Eclipse na/usr/include/
— RobV

1
W Yosemite. Korzystanie z Eclipse Juno. Ten rodzaj zadziałał dla mnie, z wyjątkiem ścieżki, którą podałem, była nieco inna (/ Users / SrinivasanNatarajan / android-ndk / platform / android-19 / arch-arm / usr / include). Mimo że wszystkie nierozwiązane błędy zniknęły, nadal mam wątpliwości, czy „wyznaczyłem właściwą ścieżkę”. „Eclipse naprawdę jest do bani”. Musiałem spędzić godziny, aby skonfigurować IDE do programowania.
— Srinivasan N

1
Dzięki. Pomógł mi tylko twój wariant.
— Nikmoon

W moim przypadku (z MinGW) użyto „System plików ...”, aby dodać katalog „C: \ MinGW \ include”
— Gary99

17

dodając tylko do bazy wiedzy, właśnie to zrobiłem na win7 z cygwin.

to wydaje się działać w moim przypadku.

uwzględnij ścieżki dla c:

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

dołącz ścieżki do języka 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

to daje mi czystą kompilację hello world.


Jestem z przyszłości. Przyszedłem podziękować. To właściwie pierwsza rzecz, która zadziałała. Nigdy nie miałem tak trudnego świata witaj. Dziękuję Panu.
— nVentimiglia

17

Przejdź do Project> Properties> C / C ++ General> Preprocessor Includes> Providers i wybierz oba:

  • „Wbudowane ustawienia kompilatora CDT GCC”
  • „Ustawienia wbudowanego kompilatora CDT CROSS GCC”

Dla każdego z nich wybierz również podpunkt: „Użyj dostawcy globalnego współdzielonego między projektami”.

Testowane na Eclipse 4.8.0 w Ubuntu 16.04 z C i C ++ Hello World.


3
... i zaznacz pole „Użyj globalnego dostawcy udostępnianego między projektami”
— Urhixidur,

Musiałem również sprawdzić „Użyj globalnego dostawcy współdzielonego między projektami”, o czym wspomniał @Urhixidur. Wypróbowałem wiele rozwiązań tego wbudowanego błędu zaćmienia i to jest to, które faktycznie działało dla mnie. Te linie były irytujące. Dzięki!
— CodeGuyRoss

10
  • Wybierz Plik >> Nowy projekt
  • W Kreatorze projektu wybierz C / C ++ >> C ++ Project
  • W sekcji „Typ projektu” wybierz „ Makefile Project >> Hello world C ++ Project ”
  • W sekcji „Narzędzia” wybierz „ Linux GCC ”

Może rozwiązać problem. (Przepraszam za zły angielski)


1
Zrobiłem te rzeczy, ale nadal nie rozpoznałem, że nagłówki znajdują się w / usr / include.
— Cardiff Space Man

O wiele łatwiejsze niż dodawanie każdego z osobna. Użyłem opcji cross plattform, która również działała dobrze (na Ubuntu)
— panmari

Bardzo pomocne! Świetny angielski.
— AturSams

Jak to zrobić w istniejącym projekcie?
— Jay Elston,

4

Używam Eclipse z Cygwin i to zadziałało:

Przejdź do Project> Properties> C / C ++ General> Preprocessor Includes ...> Providers i wybierz "CDT GCC Built-in Compiler Settings Cygwin [Shared]".


4

Pracuję z wieloma konfiguracjami kompilatorów krzyżowych , w których muszę używać różnych lokalizacji dla plików nagłówkowych STD (i innych zmiennych środowiskowych).

Rozwiązaniem było skonfigurowanie indeksatora tak, aby korzystał z aktywnej konfiguracji.
Niestety z powodu błędu w eclipse opcja nie jest przechowywana lokalnie, więc jeśli chcesz zapisać konfigurację po ponownym otwarciu eclipse , musisz użyć konfiguracji obszaru roboczego .

Okno -> Preferencje -> C / C ++ -> Indeksator -> Użyj konfiguracji aktywnej kompilacji

Spowoduje to, że eclipse użyje odpowiedniego kompilatora, który jest ustawiony w aktywnej konfiguracji Cross GCC projektu.


Miał ten sam problem, kompilując krzyżowo do ESP8266. Szkoda, że ​​ta strona jest tak zatłoczona, że ​​sam musiałem to rozgryźć.
— Michael Böckling

Dziękuję Ci za to. Ten problem wystąpił również po utworzeniu wielu konfiguracji kompilatorów krzyżowych (dla różnych wersji osadzonego SDK ESP32 „ESP-IDF”). Indeksator nie pobierał poprawnych nagłówków. Wydaje się, że to ustawienie pozwala indeksatorowi na użycie tego samego środowiska, co aktywna konfiguracja, co w moim przypadku pozwoliło mu na pobranie odpowiednich nagłówków.
— davidA

3

Jak zauważają najlepsze odpowiedzi, konieczne jest określenie, gdzie znajdują się foldery kompilacji, które można dodać za pomocą okna dialogowego dostępnego po kliknięciu projektu prawym przyciskiem myszy i wybraniu Właściwości-> C / C ++ Ogólne-> Ścieżki i symbole.

Pozostaje pytanie, jakie ścieżki należy dodać.

Jeśli masz poprawnie skonfigurowane gcc do dostępu z linii poleceń i chcesz wiedzieć, jakie są domyślne ścieżki dołączania, których używa, po prostu zapytaj; w zależności od języka, który Cię interesuje, użyj:

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

... to wyświetli listę domyślnych ustawień kompilatora, które są używane podczas wywoływania gcc (i to polecenie działa również, jeśli "gcc" jest naprawdę aliasem dla clang, jak na OSX).

/dev/null jest używany jako pusty plik - mówimy gcc, aby przeanalizował pusty plik

-x <language> określa język do kompilacji jako konieczny, ponieważ nie używamy pliku z rozszerzeniem określającym język

-v szczegółowe dane wyjściowe, które obejmują wyświetlanie ścieżek dołączania

-E wykonuje tylko wstępne przetwarzanie, wypisuje wstępnie przetworzony plik (zapobiega to narzekaniu przez gcc, że pusty plik nie kompiluje się poprawnie)

Na dole będzie lista katalogów z dołączonymi plikami:

#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.

Jeśli wprowadzisz wymienione tutaj katalogi, w podanej kolejności, do okna dialogowego ścieżek i symboli Eclipse, Eclipse CDT powinno być w stanie znaleźć standardowe nagłówki i być może jakieś dodatkowe nagłówki specyficzne dla twojego systemu operacyjnego.

(Z podziękowaniami za odpowiedź Devnulla na powiązane pytanie.)


Naprawdę BARDZO przydatne.
— sancho.s ReinstateMonicaCellio

1

W ADT wykonałem następujące czynności:

  1. kliknij prawym przyciskiem myszy projekt i wybierz Właściwości
  2. rozwiń C / C ++ General i wybierz Preprocessor Include Paths, Macros etc.
  3. wybierz opcję Wpisy ustawień użytkownika CDT
  4. wybierz Dodaj ... z menu po prawej stronie
  5. W polu Dodaj katalog dołączony zmień ścieżkę projektu na ścieżkę systemu plików
  6. Przejdź do katalogu zawierającego pliki dołączane
  7. zamieszaj i powtórz w razie potrzeby

1

Zwykle Eclipse powinno być w stanie automatycznie rozwiązać standardowe pliki dołączane. Robi to, wywołując gcc i pytając o jego konfigurację. Najprawdopodobniej Eclipse nie znajduje twojego gcc (a przynajmniej wersji, której używasz do kompilacji).

Zamiast określać wszystkie standardowe ścieżki dołączania w ustawieniach projektu, prawdopodobnie chcesz się upewnić, że Eclipse znajdzie gcc. Dodaj katalog, w którym znajduje się gcc, do zmiennej środowiskowej PATH przed uruchomieniem Eclipse.

Jeśli chcesz, aby różne projekty korzystały z różnych kompilatorów, możesz dostosować opcje wykrywania. Są one domyślnie ukryte, więc najpierw włącz je w oknie> Preferencje> C / C ++> Ustawienia stron właściwości> Wyświetl stronę „Opcje wykrywania”. Następnie możesz je znaleźć w C / C ++ Build> Discovery Options we właściwościach projektu.


1

Używam środowiska CodeWarrior IDE opartego na eclipse do projektów osadzonych i właśnie rozwiązałem ten problem, usuwając i ponownie dodając adresy źródłowe do sekcji Właściwości projektu-> C / C ++ Ogólne-> Ścieżka i symbole-> Dołącz katalogi. Oznacza to, że istnieje wiele powodów, aby przyjąć komunikat „Nierozwiązane uwzględnienie:”, a także wiele rozwiązań.


0

Błąd podczas konfigurowania ścieżek i symboli polega na tym, że początkowo skonfigurowałem ścieżki dołączania dla innego języka. Pracuję z CDT i Cygwin gnu C ++. Musisz więc skonfigurować symbole i ścieżki w języku GNU C ++.wprowadź opis obrazu tutaj


0

Ustawiono również ${COMMAND}nagcc w systemie Linux

Pod:

  • Projekt
  • Nieruchomości
  • C / C ++ Ogólne
  • Preprocesor zawiera ścieżki, makra itp.
  • Dostawcy
  • Wbudowane ustawienia kompilatora CDT GCC
  • Polecenie pobierania specyfikacji kompilatora

Zastąpić:

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

z:

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

Jeśli tego nie zrobisz, standardowe wyjście Eclipse pokaże:

Unable to find full path for "-E"

i logi pod ${HOME}/eclipse-workspace/.metadata/.logpokazem:

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

ponieważ ${COMMAND} ${FLAGS}są puste, więc Eclipse próbuje wykonać plik-E następną.

Zastanawiam się, czy możemy poprawnie zdefiniować COMMANDiFLAGS zmienne w ustawieniach, ale próbowałem dodać je jako zmienne kompilacji i nie zadziałało.

Wersja pytania w C ++: Jak rozwiązać problem „Nierozwiązane włączenie: <iostream>” w pliku C ++ w Eclipse CDT?

Testowane na Eclipse 2020-03 (4.15.0), Ubuntu 19.10 i tym minimalnym projekcie Makefile z istniejącymi źródłami .


0

Czy sprawdzasz, czy jest kompilowany z wiersza poleceń? Dla mnie pomaga w Linuksie, apt install libc-dev.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.