2013-09-10 5 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.

Код раздела в 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-й строке макроса)

Почему перестают работать без видимой причины моя среда сборки?


UPDATE 1:

Я только что рассмотрели один и тот же файл на другой плате под управлением 12.03, а также один на системе 12.04. Похоже, действительно есть синтаксическая ошибка в файле string2.h на 1-й доске. Две другие файлы показывают:

# define __strdup(s) \ 

вместо:

# define __strdup(sp \ 

так его ) был заменен p. Единственное объяснение, о котором я могу сейчас думать, это то, что используемая SD-карта начинает испортить файлы. Однако любое другое объяснение приветствуется.

+0

Поверхностно, кажется, что используемый вами 'string2.h' не согласуется с используемым компилятором C. Изменение уровня оптимизации не должно влиять на действительность кода C в целом. Вы недавно изменили компилятор? Или файлы заголовков? –

+0

Нет, насколько мне известно. – ysap

+1

Возможна аппаратная проблема, возможно, на носителе. – ldav1s

ответ

0

С тех пор, как он использовался в прошлом, и string2.h изменен на SD-карте, скорее всего, на карте SD есть плохой сектор.

Смежные вопросы