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卡開始損壞文件。但是,任何其他解釋讚賞。
從表面上看,您使用的'string2.h'似乎與您正在使用的C編譯器不一致。一般來說,更改優化級別不應該影響C代碼的有效性。你最近是否更改過編譯器?還是頭文件? –
不,據我所知。 – ysap
可能是存儲介質的硬件問題。 – ldav1s