2013-09-10 78 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卡中存在坏扇区。