C 표준 라이브러리 헤더 용 Eclipse CDT의 "해결되지 않은 포함"오류


96

이클립스 용 CDT를 설정하고 간단한 hello world C 프로그램을 작성했습니다.

#include <stdio.h>

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

프로그램은 올바르게 빌드되고 실행되지만 eclipse "Unresolved inclusion: <stdio.h>"는 마우스를 올려 놓을 때 말하는 포함 문 옆 에이 노란색 물음표를 계속 표시 합니다.

프로그램 실행에는 영향을주지 않지만 다소 짜증이납니다.

누구든지 그것을 제거하는 방법을 알고 있습니까?


2
Hello World 예제가이 작업을 수행하거나 적어도 도움을 줄 것이라고 생각할 것입니다. Eclipse에 컴파일러가 포함되어 있지 않다면 왜 그렇지 않습니까?
Doug Molineux 2012 년

답변:


50

Eclipse가 사용하는 컴파일러는 기호를 잘 해결할 수 있으므로 코드가 잘 컴파일됩니다.

그러나 Eclipse가 사용하는 코드 완성 / 인덱서 ​​또는 전처리 기는 어디에 stdio.h존재 하는지 알지 못합니다 .

이있는 파일 시스템 경로를 지정해야합니다 stdio.h.

Eclipse 문서는 컴파일러에 대한 여러 섹션에서이를 설명합니다.

그리고 코드 완성 / 인덱서 ​​또는 전처리 기가 구체적으로 다음을 찾을 수없는 경우 stdio.h:

정확한 위치 stdio.h는 코드를 작성하려는 시스템에 따라 다릅니다. Eclipse를 실행하는 동일한 시스템에 대한 코드를 작성하는 경우 표준 위치는 /usr/include/stdio.hLinux, macOS, Cygwin 등입니다.

별도의 / 원격 대상 시스템 (예 : Android, Raspberry Pi, STM32)을 위해 크로스 컴파일하는 경우 해당 시스템에 대해 설치 한 SDK의 어딘가에 위치합니다. 특정 SDK 문서를 참조해야합니다.


2
답장을 보내 주셔서 감사합니다. 그러나 Ubuntu 11.10의 경로는 어디에 있습니까?
Derrick Zhang

나를 혼란스럽게하는 한 가지는 "라이브러리 경로"탭이 아닌 "포함"탭에 경로를 추가해야한다는 것입니다. 나는 항상 "anglebracket"포함이 "라이브러리"포함이라고 생각했습니다.
aaaidan

1
포함 탭에서 헤더 파일 (예 : .h 파일)을 찾을 위치를 지정합니다. 링커에게 라이브러리 경로 탭에서 컴파일 된 라이브러리 파일을 찾을 수있는 위치를 알려줍니다. 따옴표와 꺾쇠 괄호의 규칙은 아마도 컴파일러에 따라 다르지만 항상 <>는 표준 시스템 라이브러리에서 먼저 보는 것을 의미하고 ""는 내 프로젝트를 먼저 보는 것을 의미한다고 생각합니다.
Tod

2
최신 컴파일러는 따옴표와 꺾쇠 괄호를 구분하지 않습니다. 기존의 표준 시스템 헤더는 여전히 꺾쇠 괄호 안에 있습니다.
Seppo Enarvi

53

나는 (수락 된 것을 포함하여)이 답변들이 다소 모호하다는 것을 알았습니다.

나를 위해 stdio.h가있는 경로를 추가해야했습니다 (@ardnew가 말했듯이). Eclipse에서 프로젝트의 속성을 열고 "C / C ++ General"을 확장 한 다음 "Paths and Symbols"를 선택합니다.

include사용중인 각 언어 에 대한 dir을 추가했는지 확인하십시오 . (제 경우에는 GNU C ++에 추가해야했습니다.)

여기에 이미지 설명 입력


이것은 내가 필요한 것에 매우 가깝습니다! 경로에서 사용자 이름을 변경하면됩니다.
루카스

2
OS X에서는 명령을 사용하여 명령 줄 개발자 도구 (먼저 Xcode를 설치해야 함)를 수동으로 설치해야 할 수 /usr/bin/xcode-select --install있습니다. 그러면 Eclipse를/usr/include/
RobV

1
요세미티에서. Eclipse Juno 사용. 이런 종류의 경로가 약간 달랐다는 점을 제외하면 저에게 효과적이었습니다 (/ Users / SrinivasanNatarajan / android-ndk / platforms / android-19 / arch-arm / usr / include). 해결되지 않은 모든 오류가 사라 졌음에도 불구하고 나는 여전히 '내가 올바른 경로를 설정 했는가'라는 의심이 있습니다. "Eclipse 정말 짜증나." 개발을 위해 IDE를 설정하는 데 몇 시간을 소비해야했습니다.
Srinivasan N

1
감사. 당신의 변종만이 나를 도왔습니다.
Nikmoon

필자의 경우 (MinGW 사용) "파일 시스템 ..."을 사용하여 "C : \ MinGW \ include"디렉토리 추가
Gary99

17

지식 기반에 추가하기 만하면, 저는 cygwin으로 win7에서 이것을했습니다.

이것은 나를 위해 일하는 것 같습니다.

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

프로젝트> 속성> C / C ++ 일반> 전 처리기 포함> 공급자로 이동하고 둘 다 선택합니다.

  • "CDT GCC 내장 컴파일러 설정"
  • "CDT CROSS GCC 내장 컴파일러 설정"

이들 각각에 대해 "프로젝트간에 공유 된 글로벌 공급자 사용"하위 항목도 선택합니다.

C 및 C ++ hello world를 사용하여 Ubuntu 16.04의 Eclipse 4.8.0에서 테스트되었습니다.


3
... 그리고 "프로젝트간에 공유 된 글로벌 공급자 사용"확인란을 선택합니다
Urhixidur

@Urhixidur가 언급했듯이 "프로젝트간에 공유되는 글로벌 공급자 사용"도 확인해야했습니다. 이 내장 이클립스 오류에 대한 많은 솔루션을 시도했으며 이것이 실제로 나를 위해 일한 것입니다. 그 대사는 성가시다. 감사!
CodeGuyRoss

10
  • 파일 >> 새 프로젝트 선택
  • 프로젝트 마법사에서 C / C ++ >> C ++ 프로젝트를 선택합니다.
  • "프로젝트 유형"섹션에서 " Makefile 프로젝트 >> Hello world C ++ 프로젝트 "를 선택하십시오.
  • "도구 체인"섹션에서 " Linux GCC "를 선택하십시오.

문제를 해결할 수 있습니다. (불량한 영어 실례합니다)


1
나는 그런 일을했지만 헤더가 / usr / include에 있다는 것을 여전히 인식하지 못했습니다.
카디프 우주 남자

모든 것을 추가하는 것보다 훨씬 쉽습니다. 나는 (Ubuntu에서) 잘 작동하는 cross plattform 옵션을 사용했습니다
panmari

매우 유용합니다! 훌륭한 영어.
AturSams

기존 프로젝트에서이 작업을 어떻게 수행합니까?
Jay Elston

4

나는 Cygwin과 함께 Eclipse를 사용하고 있으며 이것은 나를 위해 일했습니다.

프로젝트> 속성> C / C ++ 일반> 전 처리기 포함 ...> 공급자로 이동하여 "CDT GCC 내장 컴파일러 설정 Cygwin [공유]"를 선택합니다.


4

STD 헤더 파일 (및 기타 환경 변수)에 대해 다른 위치를 사용해야 하는 여러 교차 컴파일러 구성으로 작업하고 있습니다.

해결책은 인덱서를 설정하여 활성 구성을 사용하는 것입니다.
안타깝게도 eclipse의 일부 버그 로 인해이 옵션은 로컬에 저장되지 않으므로 eclipse를 다시 열 때 구성을 저장하려면 작업 공간 구성 을 사용해야 합니다.

창-> 환경 설정-> C / C ++-> 인덱서-> 활성 빌드 구성 사용

이렇게하면 Eclipse가 프로젝트의 활성 Cross GCC 구성으로 설정된 올바른 컴파일러를 사용하게됩니다.


ESP8266으로 크로스 컴파일하는 동일한 문제가 발생했습니다. 안타깝게도이 페이지가 너무 혼잡해서 직접 알아 내야했습니다.
Michael Böckling

감사합니다. 또한 여러 교차 컴파일러 구성 (ESP32 "ESP-IDF"임베디드 SDK의 다른 버전에 대해)을 만든 후에도이 문제가 발생했습니다. 인덱서가 올바른 헤더를 선택하지 않았습니다. 이 설정은 인덱서가 활성 구성과 동일한 환경을 사용하도록 허용하는 것 같습니다. 제 경우에는 올바른 헤더를 선택할 수있었습니다.
davidA

3

상위 답변에서 언급했듯이 빌드 폴더가있는 위치를 지정해야합니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성-> C / C ++ 일반-> 경로 및 기호를 선택하면 대화 상자를 통해 추가 할 수 있습니다.

나머지 질문은 추가해야 할 경로입니다.

gcc가 명령 줄 액세스를 위해 올바르게 설정되어 있고 사용하는 기본 포함 경로가 무엇인지 알아야하는 경우 요청하십시오. 관심있는 언어에 따라 다음을 사용하십시오.

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

... 이것은 gcc를 호출 할 때 사용되는 기본 컴파일러 설정을 나열합니다 (이 명령은 OSX에서와 같이 "gcc"가 실제로 clang의 별칭 인 경우에도 작동합니다).

/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가 표준 헤더와 OS에 특정한 추가 헤더를 찾을 수 있어야합니다.

( 관련 질문에 대한 devnull의 답변 덕분에 .)


실제로 매우 유용합니다.
sancho.s ReinstateMonicaCellio

1

ADT에서 다음을 수행했습니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오.
  2. C / C ++ General을 확장하고 Preprocessor Include Paths, Macros 등을 선택합니다.
  3. CDT 사용자 설정 항목 선택
  4. 오른쪽 메뉴에서 추가 ...를 선택합니다.
  5. 포함 디렉토리 추가에서 프로젝트 경로를 파일 시스템 경로로 변경하십시오.
  6. 포함 파일이있는 디렉토리를 찾습니다.
  7. 필요에 따라 저어주고 반복하십시오.

1

일반적으로 Eclipse는 표준 포함 파일을 자동으로 해석 할 수 있어야합니다. gcc를 호출하고 구성을 요청하여이를 수행합니다. Eclipse가 gcc를 찾지 못할 가능성이 높습니다 (또는 적어도 컴파일에 사용하는 버전이 아님).

프로젝트 설정에서 모든 표준 포함 경로를 지정하는 대신 Eclipse가 gcc를 찾는 지 확인하고 싶을 것입니다. Eclipse를 시작하기 전에 gcc가있는 디렉토리를 PATH 환경 변수에 추가하십시오.

다른 프로젝트에서 다른 컴파일러를 사용하도록하려면 검색 옵션을 조정할 수 있습니다. 기본적으로 숨겨져 있으므로 먼저 창> 환경 설정> C / C ++> 속성 페이지 설정> "검색 옵션"페이지 표시에서 활성화합니다. 그런 다음 프로젝트 속성의 C / C ++ 빌드> 검색 옵션에서 찾을 수 있습니다.


1

임베디드 프로젝트에 Eclipse 기반 CodeWarrior IDE를 사용하고 있으며 소스 주소를 삭제하고 Project Properities-> C / C ++ General-> Path and Sybols-> Include Directories에 다시 추가하여이 문제를 해결했습니다. 이것은 "Unresolved included :"메시지를받을 이유가 많고 해결책도 많다는 것을 의미합니다.


0

경로 및 기호를 구성 할 때 발생한 오류는 처음에 다른 언어에 대한 포함 경로를 구성했다는 것입니다. 저는 CDT 및 Cygwin gnu C ++로 작업하고 있습니다. 따라서 GNU C ++ 언어에서 기호와 경로를 구성해야합니다.여기에 이미지 설명 입력


0

Linux 에서도 설정 ${COMMAND}gcc

아래에:

  • 계획
  • 속성
  • 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는 다음에 오는 을 실행하려고합니다 .

설정 에서 COMMANDFLAGS변수를 올바르게 정의 할 수 있는지 궁금 하지만 빌드 변수로 추가하려고했지만 작동하지 않았습니다.

질문의 C ++ 버전 : Eclipse CDT의 C ++ 파일에서 "해결되지 않은 포함 : <iostream>"을 해결하는 방법은 무엇입니까?

Eclipse 2020-03 (4.15.0), Ubuntu 19.10 및 기존 소스가있는최소 Makefile 프로젝트에서 테스트되었습니다 .


0

명령 줄에서 컴파일되었는지 확인합니까? 나를 위해 Linux에서 apt 설치 libc-dev.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.