ошибка в errno.h (и больше) при компиляции файлов, сгенерированных lex - PullRequest
0 голосов
/ 25 августа 2018

В настоящее время я получаю сообщение об ошибке:

In file included from /usr/include/errno.h:35:0,
                 from lex.yy.c:21:
/usr/include/x86_64-linux-gnu/bits/errno.h:50:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘extern’
 extern int *__errno_location (void) __THROW __attribute__ ((__const__));
 ^

(вместе со многими другими) при попытке скомпилировать файл, сгенерированный lex, с помощью команды:

gcc lex.yy.c

lex.l (файл передан в lex для генерации lex.yy.c) источник:

%%
"hello world"   printf("goodbye");
.               ;
%%

Эта проблема возникает, когда я пытаюсь скомпилировать любой файл, который был сгенерирован lex или flex (я пробовал оба)

Как я уже упоминал, есть также много других ошибок, но, возможно, исправление этой ошибки решит некоторые другие.После поиска некоторых распространенных ошибок в файле errno.h и не найдя ничего полезного, я спрашиваю здесь.

Я использую Ubuntu 16.04 LTS.Дайте мне знать, если вам нужна дополнительная информация о проблеме, и я сделаю все возможное, чтобы помочь.

Спасибо за любой совет:)

Изменить для 'rici':

Первые 21 строка моего файла lex.yy.c выглядят следующим образом:

    #line 3 "lex.yy.c"

    #define  YY_INT_ALIGNED short int

    /* A lexical scanner generated by flex */

    #define FLEX_SCANNER
    #define YY_FLEX_MAJOR_VERSION 2
    #define YY_FLEX_MINOR_VERSION 6
    #define YY_FLEX_SUBMINOR_VERSION 0
    #if YY_FLEX_SUBMINOR_VERSION > 0
    #define FLEX_BETA
    #endif

    /* First, we deal with  platform-specific or compiler-specific issues. */

    /* begin standard C headers. */
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>
    /* end standard C headers. */

Редактировать для @ sepp2k:

Я использовал vimdiff для сравнения 2 файлов.

Вещи, которые есть в моем файле, но отсутствуют в вашем:

#ifdef __cplusplus

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else   /* ! __cplusplus */

/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)

#define YY_USE_CONST

#endif  /* defined (__STDC__) */
#endif  /* ! __cplusplus */

#ifdef YY_USE_CONST

===============================================================

#include <string.h>
#include <errno.h>
#include <stdlib.h>
#line 476 "lex.yy.c"

На самом деле в вашем файле нет ничего, чего бы не было в моем

Любого другогоРазличия, похоже, просто различия в форматировании.

Я также проверил четыре файла заголовка в стандартной программе на Си (посмотрите, что вы имеете в виду сейчас), и я могу подтвердить, что это errno.h, который вызывает ошибку.

Привет мир в C с включенным errno.h выдает следующую ошибку:

In file included from /usr/include/errno.h:35:0,
                 from test.c:2:
/usr/include/x86_64-linux-gnu/bits/errno.h:50:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘extern’
 extern int *__errno_location (void) __THROW __attribute__ ((__const__));
 ^
In file included from test.c:4:0:
/usr/include/stdio.h:13:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
 int printf(const char* __restrict, ...);
 ^

edit for @rici:

Вот полный дамп ошибок, возникающих прия запускаю "gcc lex.yy.c": https://gist.github.com/raygarner/0601e57f5be21e16e0ae4ee34643b121

редактировать для @ sepp2k:

ранее, я тестировал этот точно такой же процесс компиляции на новой установке Debian 9 вВМ и я получили ту же самую ошибку, которую я делаю здесь, на Ubuntu после исправления errno.h

Вот как это выглядит:

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 26 августа 2018

Как мы выяснили в комментариях, исходная ошибка была вызвана ошибкой errno.h в вашей системе, и вы исправили это, переустановив файл.

После этого ваш код будет хорошо скомпилирован, но не будет ссылаться как отдельное приложение из-за отсутствия функций yywrap и main. Вы можете исправить первое, определив yywrap или используя %option noyywrap. Последнее может быть исправлено путем определения главной функции или связывания с объектным файлом, который определяет main (если лексер является частью более крупного проекта, который уже определяет свою собственную основную функцию).

Вы также можете исправить обе проблемы, связав -lfl, который определяет функции yywrap и main для чтения из stdin или имен файлов из argv, а затем печатает полученные токены в stdout. Конечно, это полезно только для целей тестирования, так как в реальных проектах вы захотите сделать больше, чем это обычно.

...