Почему мой компилятор flex / yacc неправильно компилируется на другом компьютере с Linux - PullRequest
2 голосов
/ 18 ноября 2009

На моей машине (Windows работает под управлением Cygwin) он компилируется правильно. Flex - это версия 2.5.35, а bison - это версия 2.3

.

На Linux-машине 1 он компилируется правильно. Flex - это версия 2.5.4, а bison - версия 1.875c.

На Linux-машине 2 он не компилируется правильно. Flex - это версия 2.5.4, а бизон - 2.3.

Можно было бы ожидать, глядя на номера версий flex / bison, что если он правильно скомпилируется на моей машине, он будет скомпилирован правильно на машине 2, но это не так.

На Linux-машине 2, когда я запускаю gcc -c y.tab.c, я получаю следующие предупреждения несколько раз

предупреждение: несовместимое неявное объявление встроенной функции 'printf'

И когда я запускаю следующее

gcc -o cminus y.tab.o lex.yy.o -ly -lfl

Я получаю следующую ошибку.

gcc -o cminus y.tab.o lex.yy.o -ly -lfl
/usr/bin/ld: cannot find -ly
collect2: ld returned 1 exit status
make: *** [cminus] Error 1

Эту ошибку можно устранить, выбрав опцию -ly в gcc, чтобы программа компилировалась, но скомпилированная программа не работает должным образом, как на моем компьютере и другом компьютере с Linux.

Что может быть причиной проблемы?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2009
/usr/bin/ld: cannot find -ly

- это сообщение, которое вы получаете, когда компоновщик не может найти библиотеку.

Вам нужно найти liby.a или liby.so, а затем вставить -L<that path> в командную строку gcc.

На моей установке Cygwin он находится в /lib/liby.a, поэтому я бы использовал что-то вроде:

gcc -o cminus y.tab.o lex.yy.o -L /lib -ly -lfl
0 голосов
/ 22 ноября 2009

Предупреждение звучит так, как будто в некотором исходном файле отсутствует «#include». Ошибка ссылки означает, что на вашем компьютере не установлен liby.a. liby является частью yacc и некоторых версий bison, но на самом деле редко требуется (он просто определяет реализации по умолчанию yyerror и нескольких других вещей). Тот факт, что он связывается без него, означает, что он вам действительно не нужен.

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

...