2012-01-11 33 views
6

Tôi đang biên dịch grep trên trình biên dịch GCC 64 bit cho Windows 7 x64 SUA/Interix.stddef.h: lỗi: duplicate 'unsigned'

Nó nghẹn trên dòng rõ rệt trong stddef.h:

#ifndef _SIZE_T_DEFINED 
#if defined (lp64) || defined(_WIN64) 
#ifdef lp64 
typedef unsigned long size_t;     // <------ error 
#else /* lp64 */ 
typedef unsigned __int64  size_t; 
#endif /* lp64 */ 
#else /* (defined(lp64) || defined(_WIN64)) */ 
typedef unsigned int size_t; 
#endif /* (defined(lp64) || defined(_WIN64)) */ 
#define _SIZE_T_DEFINED 
#define _SIZE_T 
#endif /* _SIZE_T_DEFINED */ 

Kết quả cho make là:

make all-recursive 
Making all in intl 
gcc -c -DLOCALEDIR=\"/usr/local/share/locale\" -DLOCALE_ALIAS_PATH=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -DIN_LIBINTL -DHAVE_CONFIG_H -I.. -I. -I../../intl -D_ALL_SOURCE -D_REENTRANT -I/usr/local/include -I/usr/local/include -D_ALL_SOURCE -D_REENTRANT ../../intl/intl-compat.c 

In file included from ../../intl/gettextP.h:23:0, 
       from ../../intl/intl-compat.c:25: 
/usr/include/stddef.h:50:23: error: duplicate 'unsigned' 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build/intl. 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build (line 329 of Makefile). 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build (line 244 of Makefile). 

Tôi không hiểu những gì nguyên nhân là ... nó đã nhầm lẫn rằng long đang được sử dụng như thể nó là 64-bit trong GCC, nhưng lỗi thậm chí còn khó hiểu hơn! Ý tưởng?

+1

Có vẻ như lâu đã đượC#defined để bỏ dấu ở đâu đó trước đó trong chuỗi bao gồm. –

+0

Có thể 'size_t' được định nghĩa trước là macro, nói' #define size_t unsigned int' hay gì đó, nhưng '_SIZE_T_DEFINED' không được xác định? Sau đó, dòng có vấn đề sẽ tương đương với 'typedef unsigned long unsigned int;' (hoặc tương tự), sẽ kích hoạt thông báo lỗi đó. – ruakh

+0

Các bạn hoàn toàn đúng :) cảm ơn vì con trỏ, nó khá là khó hiểu. – Mehrdad

Trả lời

10

Một nơi nào đó trong mã của bạn, somone lẽ đã làm:

#define size_t unsigned long 

Hoặc một cái gì đó dọc theo những dòng này, mà không cần phải định nghĩa _SIZE_T_DEFINED khi họ đã làm điều đó. Sau đó, mã của họ #include s stddef.h thông qua đường dẫn được liệt kê trong thông báo lỗi của bạn. Điều đó làm cho dòng lỗi của bạn trông giống như:

typedef unsigned long unsigned long; 

Trình biên dịch sẽ không hoạt động!

+1

: O thực sự, tôi chỉ tìm kiếm với 'grep' (cách meta ...) và thấy:' ./config.h:#define size_t unsigned int' ... thanks! – Mehrdad

+0

Các autoconf phải có giả định một trình biên dịch/thực hiện rất lỗi thời cho nó để xác định 'size_t' như là một macro ... – dreamlax

+0

@Mehrdad, không thành vấn đề. Vui vẻ giúp đỡ! –