2011-03-08 3 views
0

나는 컴파일하고 잘 실행 다음과 같은 매우 간단한 응용 프로그램이 있습니다이상한 오류 추가 사용법 #include <string>

편집 : 진짜 문제

int main() { 
    return 0; 
} 

으로의 혼란을 종료 simpilar로 예제를 변경 내가 #include <string>를 추가 (심지어 표준 : : 문자열을 참조하지) 곧, 그것은 컴파일에 실패하고 난 다음 오류 얻을 :

/usr/include/c++/4.1.2/bits/allocator.h:82 error: expected template-name before '<' token

약 456 개의 기타 유사한 오류가 있습니다.

아이디어가 있으십니까? 감사!

UPDATE :

라인 (82) /usr/include/c++/4.1.2/bits/allocator.h의 참조 오류의 위치에있는 템플릿 __glibcxx_base_allocator. 해당 템플릿은 bits/c++allocator.h에 정의되어 있습니다. 해당 파일을 찾기 위해 시스템을 검색 할 때 3 건의 조회가 발생하지만 그 중 아무 것도 예상대로 /usr/include/c++/4.1.2/bits/에 없습니다.

버전 3.1.6, 4.1.1 및 4.3.2가 있지만 포함되지 않은 4.1.2는 포함되어 있습니다. 어떤 파일이 사용되고 있는지 확실하지 않지만 (알 수없는 파일에 대해서는 오류가 발생하지 않음) 문제가 발생할 수 있습니다.

+0

덧붙여서 : 나는'g ++ hello.cc -o hello'를 사용하여 컴파일하고 아무것도 만들지 않는다. – steveo225

+0

실패한 전체 파일을 게시 할 수 있습니까? – yan

+1

'g ++ --version'의 출력은 무엇입니까? – Johnsyweb

답변

1

문제는 설치된 개발 패키지가 정확하지 않거나 불완전한 것으로 나타납니다 (손상되지 않도록 혼동하지 말 것).

g++ -nostdic++ hello.cc -o hello -I/usr/include/c++/3.4.6

모든 다른 디렉토리 (4.1.1, 4.1.2 및 4.3.2)가 불완전 부적절한 파일을 일으키는 비정상적 오류의 원인이 포함되어야한다 : 다른이 버전을 포함 사용할 ++ g을 강제 것을 수정합니다. 예를 들어

/usr/include/c++/4.1.2/bits/allocator.h/usr/include/c++/4.1.1 또는 /usr/include/c++/4.3.2 하나에서 포함 호환되도록 표시되는 bits/c++allocator.h 위치한 __glibcxx_base_allocator 필요하다. 컴파일러가 Include의 유일한 세트를 사용하도록 강제하면이를 수정합니다.

+0

모두에게 도움을 주셔서 감사합니다. 대답을 위해 노력한 지 며칠이 지난 후에, 나는 마침내 그것을 알아 냈고 나의 발견을 공유 할 것이라고 생각했습니다. – steveo225

+0

오타가 있습니다 ** - nostdinC++ ** not -nostdiC++ – tbozo

0

거의 확실하게 g ++는 C++가 아닌 C 소스 파일로 .cc을 탐지하고이를 C++로 컴파일하는 대신 gcc로 전달합니다. 파일 이름을 hello.C으로 바꾸면 쉽게 테스트 할 수 있습니다. g ++에 사용할 수있는 언어 매개 변수가 있습니다.

EDIT : 이것은 g ++ 4.2에서 .cc 확장명으로 잘 작동하는 것 같습니다. 다른 헤더가 포함되어 있습니까? 그들은 <string>을 방해 할 수 있습니다.

EDIT2 : 헤더가 올바르게 설정되지 않았을 수 있습니다. 이 작업을 수행합니다 C++ 표준 라이브러리 헤더/손상된 경우이 같은

#include <string> 
int main() 
{ 
    return 0; 
} 
+5

템플릿 이름을 예상하는 데 오류가 발생하므로 의심 스럽습니다. 또한 .cc는 일반적인 C++ 확장입니다. – yan

+0

나는 또한 그것을 의심합니다. 이건 내 실제 응용 프로그램 *** 충격 *** 아니지만 내 진짜 하나의 문제를 가진 클래스와 상속을 사용하여 그냥 STL 것으로 보인다 – steveo225

+0

아니, 아니 포함, 귀하의 예제뿐만 아니라 같은 오류와 함께 실패했습니다. – steveo225

0

오류가 들어있다가 발생하지 않기 완전히 설치 - 어쩌면 당신의 456 기타 오류 중 포함 누락 된 참조 심지어 메시지가있다.

어쨌든 libstdc++-devel, 배포판의 C++ 표준 라이브러리 헤더 파일을 포함하는 패키지가 제대로 설치되었습니다.

+0

최근에 올바른 버전이 설치되었는지 확인한 다음 다시 설치해 디스크의 패키지가 손상되지 않았다고 말하지 않았습니다. 또한 전체 빌드 로그를 확인하고 누락 된 파일을 확인하지 않았고 대부분의 오류는'undefined type '을 잘못 사용했습니다. struct std :: allocator ' – steveo225

0

전처리 단계에서 오류가 발생할 수 있습니다. 플래그 -E를 gcc에 전달하여 cpp 파일을 사전 처리하고 컴파일러가 불평하는 장소를 살펴보십시오.

+0

시도해 보았습니다. 응용 프로그램은 아무 것도하지 않습니다. 전처 리기가 불만을 제기하고 아무것도 stderr에 보내지지 않은 곳에서는 어디에도 보지 못했지만 특정 출력에 익숙하지 않다는 것을 인정합니다. – steveo225

+0

전 처리기 오류를 의미하는 것이 아니라 전처리 기가 처리 한 후에 오류가 발생했습니다. "#define public private"와 같은 어리석은 매크로를 가지고 있다면 전처리가 코드에 어떤 영향을 미칠지 생각해보십시오. 코드가 컴파일되지 않습니다. – dimba

+0

/usr/include/c++/4.1.2/bits/allocator.h의 preprocedd 파일 줄 82를 살펴보십시오. 줄이 달라 보이는 경우 줄을 변경 한 어딘가의 매크로 – dimba

0

포함 경로를 확인하십시오. 경로는 환경 변수로 지정하거나 명령 행에서 지정할 수 있습니다. 다른 컴파일러 또는 동일한 컴파일러의 다른 버전에서 포함 파일을 사용할 수 있습니다.

또한 <stdio.h> 대신 <cstdio>을 사용해보십시오.

또 다른 제안 : <>을 ""(으)로 변경하십시오.

+0

문제는 stdio.h에서 문제가되지 않습니다. 문제가 문자열, 벡터, iostream 등 모든 STL 포함에 있습니다. g ++ - 버전 4.1.2도 포함 파일이있는 버전 폴더입니다, 그래서 나는 그것이 일치하는 것을 확신합니다. – steveo225

+0

@ steveo255 : 문제가 어디에 있지 않은 것이 확실합니까? 이전 C 언어보다이 C++ 헤더를 사용해 보셨습니까? – Johnsyweb

+0

문제는 인쇄와 관련이 없으므로이를 반영하기 위해 예제를 변경했습니다 (더 이상 stdio가 아닙니다.).h 또는 printf). 문제는 모든 STL 헤더를 포함 할 때 컴파일되지 않고 동일한 오류가 발생하는 것입니다. – steveo225