Я бегу 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-карта начинает испортить файлы. Однако любое другое объяснение приветствуется.
Поверхностно, кажется, что используемый вами 'string2.h' не согласуется с используемым компилятором C. Изменение уровня оптимизации не должно влиять на действительность кода C в целом. Вы недавно изменили компилятор? Или файлы заголовков? –
Нет, насколько мне известно. – ysap
Возможна аппаратная проблема, возможно, на носителе. – ldav1s