2009-07-10 17 views
10

이것은 이전에 나왔지만, 어떻게 고쳐 졌는지 기억이 안납니다.size_t는 g ++ - 4.1 또는 우분투 8.1의 다른 것들에 의해 발견되지 않습니다.

새로운 Ubuntu 설치시 일부 프로그램을 컴파일 할 수 없습니다 ... 뭔가 머리말이 잘못되었습니다.

g ++ - 4.1 및 4.3을 사용하지 않으려 고 시도했습니다.

g++ -g -frepo -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include -c qlisttest.cpp 
/usr/include/libio.h:332: error: ‘size_t’ does not name a type 
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope 
/usr/include/libio.h:364: error: ‘size_t’ has not been declared 
/usr/include/libio.h:373: error: ‘size_t’ has not been declared 
/usr/include/libio.h:493: error: ‘size_t’ does not name a type 
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared 
... 

파일 ...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
... 



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t 
typedef __kernel_size_t size_t; 
typedef __kernel_ssize_t ssize_t; 

types.h 경로에 확실히이며, 집어지고있다. 내가 파일 이름을 변경하여 확인하고 누락 된 오류가 발생했습니다 ...

아무도 아이디어가 ...? 도움을 주시면 감사하겠습니다 ...

답변

8

시작 -I는/usr/제거/linux 및 -I/usr/include를 포함하십시오. 수동으로 경로를 포함시키기 위해 시스템 디렉토리를 추가하면 효과가 없거나 내용이 손상됩니다. 또한 여분의 안전을 위해 -frepo를 제거하십시오.

4

전체 소스를 보지 않고 문제가 무엇인지 말하기는 어렵습니다. 이와 같은 문제를 디버깅하는 가장 좋은 방법은 g ++의 "-E"매개 변수를 사용하여 프로세서 전 출력을 생성 한 다음이를 포함하여 포함 된 내용을 파악하는 것입니다. 다음은 g ++ 정보 페이지에서 "-E"에 대한 내용입니다.

-E 전처리 단계 후 중지합니다. 적절한 컴파일러를 실행하지 마십시오. 출력은 전처리 된 소스 코드 형태로, 이 표준 출력으로 전송됩니다.

또한 파일 상단에 sys/types.h를 포함하지 않는 이유는 무엇입니까?

부록 :

#include <time.h> 

을 그리고 내가 실행했습니다 :

내 시스템에서

, 난 단지 포함 foo.cc라는 짧은 파일을 만들었습니다

그램 ++ -E /tmp/foo.cc> /tmp/foo.pp

이 출력을 자세히 살펴보면 다음과 같습니다. v 중요한 에리. 예를 들어, /usr/include/bits/types.h에는 __time_t에 대한 typedef가 있고 /usr/include/types.h는 해당 typedef를 사용하여 "typedef __time_t time_t"라고 말합니다. 그러나 그 정의를 둘러싼 흥미로운 다른 매크로가 있습니다. /usr/include/time.h에있는 매크로 "__BEGIN_NAMESPACE_STD"와 같은 것에주의를 기울여야합니다. 이것은 내 시스템에서 비어있는 것으로 보입니다. 그러나, 다른 시스템이이 매크로에 대해 다른 값을 가질 수 있으므로 time_t의 정의를 다른 네임 스페이스에 적용 할 수 있습니다.

Cpp 정보 페이지의 "9 전 처리기 출력"섹션에서 파일 줄의 형식을 정의하십시오. 특히 주목할 절입니다 : 양식의 선 다음

#의 LINENUM 파일 이름 FLAGS

에 의해 전달된다

소스 파일 이름과 줄 번호 정보는 "설명 FLAGS에 간다 "이 수준의 디버깅에 관심이 있습니다.

+0

감사합니다 ... sys/types.h 및 types.h를 사용하지 않으려 고 시도했습니다. 하지만 -E는 확실히 유용합니다 - size_t에 대한 grep과 그것에 대한 하나의 typedef를 찾을 수 없습니다 .... hmm – EdH

+0

"gcc -E /tmp/foo.c"의 출력을 비교하는 것이 좋습니다. "및"g ++ -E /tmp/foo.cc "전자는 C 컴파일러를 호출하고 후자는 C++ 컴파일러를 호출합니다. (foo.c와 foo.cc는 "#include "을 가지고 있어야합니다.) – slacy

4

일반적으로 C++에는 C .h 파일을 사용하지 않아야합니다. 쉽게 빠져 나갈 수있는 방법을 찾을 수 있지만, 이전 버전의 g ++ 및 다른 컴파일러에서 많은 부분이 허용되었지만 C++ 표준에서는 size_t가 cstddef에 있음을 정의합니다 (18.2 절/표 17 참조). g ++는 점점 엄격 해지고 있습니다.

제거 모든 당신이 당신의 명령에 추가 한 경로를 포함 (그들은 중복)을 포함하지 않을 경우 소스 코드의 상단에 추가 :

#include <cstddef> 
using namespace std; 
+0

이것은 사실이 아닙니다 .C 헤더는 C++ 번역 단위에서 허용되며, cstddef와 같은 C++ 동등한 것을 사용하는 것을 더 이상 필요가 없습니다. –

+0

C++ 컴파일러 개발자들이 실제로 시간을 낭비하고있는 것일까? –

+0

cstddef는 stddef.h와 비슷하지만 cstddef가 네임 스페이스 std에 있다는 점을 제외하고는 네임 스페이스 오염을 피하는 데 더 편리합니다. –

3

빌드 필수 패키지를 설치 했습니까?

sudo apt-get install build-essential 
+0

예. 그러나 확실히 이것을 확실히 필요로합니다. 감사. – EdH

1

stddef.h 또는 cstddef에 있어야합니다. types.h는 표준 라이브러리가 아니며, OS가 필요로하는 타입을 가리킨다 고 생각합니다.

3

후속 작업을 수행하는 것을 잊어 버렸습니다. 이 /usr/include은이 특정 배포판에 /usr/include/linux에 포함될 수 없습니다. size_t 두 번째로 닦아내는 것 같습니다.

내 포함 항목은 현재 /usr/include이며 훌륭하게 작동합니다.

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0... 

모든 포함물을 꺼내어 고정 시켰습니다.