2016-07-26 16 views
1

В моей программе используется документированный макрос автоконфигурации AM_PROG_LEX. Он строит штраф на RHEL 6.5 и других дистрибутивах, но не работает на RHEL 6.6 и позже.AM_PROG_LEX и undefined yywrap

Сценарий configure не может скомпилировать свои тесты. Когда он пытается GCC с -ll, -lfl, сшивание терпит неудачу с:

/usr/bin/ld: cannot find -lfl 

Когда он пытается GCC без дополнительных библиотек, сшивание терпит неудачу с:

undefined reference to `yywrap' 

libfl.a или libfl.so отсутствует из официальных РЕПО этих систем , На RHEL 6.5 это часть пакета flex.

RHEL 6.5 
configure:5334: checking whether yytext is a pointer 
configure:5351: gcc -o conftest -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -O0 conftest.c -lfl >&5 
configure:5351: $? = 0 
configure:5359: result: yes 


RHEL 6.8 
configure:5196: checking whether yytext is a pointer 
configure:5217: gcc -o conftest -g -O2 conftest.c >&5 
/tmp/ccNJtVgv.o: In function `input': 
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/lex.yy.c:1168: undefined reference to `yywrap' 
/tmp/ccNJtVgv.o: In function `yylex': 
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/lex.yy.c:867: undefined reference to `yywrap' 
/tmp/ccNJtVgv.o: In function `main': 
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/conftest.l:17: undefined reference to `yywrap' 
collect2: ld returned 1 exit status 
configure:5224: $? = 1 
configure: failed program was: 
... 
configure:5246: result: no 

ответ

2

libfl содержит два и только два функции, оба из которых обычно нет необходимости в использовании производства прогибается:

int main() { extern int yylex(void); while (yylex()) ; return 0; } 
int yywrap(void) { return 1; } 

yywrap реализации (который по существу отключает функцию yywrap) не требуется, если вам используйте опцию

%option noyywrap 

в вашем определении гибкого, или если передать параметр командной строки --noyywrap для гибки.

Для быстрого и грязного сканера или для отладки иногда удобно использовать libfl для заполнения вышеуказанных функций. Но он также может создавать проблемы в системах, которые обеспечивают 32- и 64-разрядные среды. По этой причине libfl был удален с RHEL flex об/мин в 2014 году. Подробности см. Здесь RedHat bug fix advisory.

Для установки libfl вы можете установить flex-devel об/мин. Или вы можете скомпилировать его самостоятельно, используя приведенный выше код (который не является точно исходным кодом, который вы найдете в комплекте с источником flex, но должен отображать точно такую ​​же библиотеку).

Или вы можете попытаться исправить автоконфигурацию так, чтобы она не зависела от libfl. У нее не было такой зависимости; если он не смог найти libfl, он просто предположил, что для компиляции программы не требуется.

+0

не будет '--noyywrap' прерывать программы, которые обеспечивают их собственную реализацию yywrap? – basin

+0

@basin: да, я бы не предложил форсировать этот вариант во всем мире. Но вы можете использовать его в программах тестирования autoconf. – rici

0

Обходным решением является установка flex-devel пакета, содержащего libfl.a. Версия RHEL доступна для подписчиков ony. Альтернативой является пакет CentOS или перекомпиляция из исходного кода.