2013-09-10 107 views
0

我正在運行Linaro Ubuntu 12.03在嵌入式平臺上。使用這個系統幾個月來構建一個簡單的程序後,我添加一個優化選項時開始收到編譯錯誤。所以,我創建了一個測試程序:系統string2.h頭文件優化時產生編譯錯誤

// test.c 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

與編譯:

gcc test.c 

的作品就好了。然而,當我添加一個優化選項:

gcc -O1 test.c 

我得到一個錯誤:

In file included from /usr/include/string.h:637:0, 
       from test.c:1: 
/usr/include/arm-linux-gnueabi/bits/string2.h:1305:3: error: "(" may not appear in macro parameter list 

發生這種情況的各級從-O1-Ofast

在另一個嵌入式系統上嘗試使用Linaro Ubuntu 12.04,它工作得很好。所以它在我的Ubuntu PC上。

string2.h的代碼段:

# define __strdup(sp \ 
    (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s)  \ 
      ? (((__const char *) (s))[0] == '\0'    \ 
      ? (char *) calloc ((size_t) 1, (size_t) 1)   \ 
      : ({ size_t __len = strlen (s) + 1;    \ 
       char *__retval = (char *) malloc (__len);  \ 
       if (__retval != NULL)     \ 
       __retval = (char *) memcpy (__retval, s, __len); \ 
       __retval; }))      \ 
      : __strdup (s))) 

(問題是在宏的第2行)

爲什麼我的編譯環境與停止工作,原因不明?


更新1:

我只是檢查了運行12.03另一個板相同的文件,以及在12.04系統上的。看起來第一塊板上的string2.h文件確實存在語法錯誤。其他兩個文件顯示:

# define __strdup(s) \ 

代替:

# define __strdup(sp \ 

所以它的)p被替換。我現在能想到的唯一解釋是我使用的SD卡開始損壞文件。但是,任何其他解釋讚賞。

+0

從表面上看,您使用的'string2.h'似乎與您正在使用的C編譯器不一致。一般來說,更改優化級別不應該影響C代碼的有效性。你最近是否更改過編譯器?還是頭文件? –

+0

不,據我所知。 – ysap

+1

可能是存儲介質的硬件問題。 – ldav1s

回答

0

由於它過去曾經工作過,而且在SD卡上更改string2.h,所以很可能SD卡中存在壞扇區。