我在嵌入式平台上运行Linaro Ubuntu 12.03 。在使用这个系统几个月来构建一个简单的程序后,我在添加优化选项时开始收到编译错误。所以,我创建了一个测试程序:
// 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)))
(问题出在宏的第二行)
为什么我的构建环境在没有明显原因的情况下停止工作?
更新 1:
我刚刚检查了另一块运行 12.03 的板上的相同文件,以及 12.04 系统上的文件。看起来string2.h
第一块板上的文件确实存在语法错误。另外两个文件显示:
# define __strdup(s) \
代替:
# define __strdup(sp \
所以它)
被替换为p
. 我现在能想到的唯一解释是我使用的 SD 卡开始损坏文件。然而,任何其他解释都是值得赞赏的。