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ąć?

Derrick Zhang
źródło
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.

ardnew
źródło
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

aaaidan
źródło
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.

Ray Tayek
źródło
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.

Mike B.
źródło
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)

Nader Aryabarzan
źródło
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]".

superm0
źródło
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.

Yochai Timmer
źródło
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.)

Theodore Murdock
źródło
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
user330844
źródło
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.

Seppo Enarvi
źródło
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ń.

Enes Akyay
źródło
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

rodolk
źródło
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 .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
0

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

Jan B Noir
źródło