Путаница с включением Yacc и Lex

Мне интересно, как правильно скомпилировать программу с Makefile, в котором есть вызовы yyparse?

Это то чем я занимаюсь:

У меня есть Makefile, который компилирует все мои обычные файлы, и они не связаны с y.tab.c или lex.yy.c (они должны быть у меня?)

Я делаю это поверх моего кода:

#include "y.tab.c"
#include "lex.yy.c"
#include "y.tab.h"

Вот что происходит, когда я пытаюсь сделать программу:

Когда я просто набираю «сделать», появляется много предупреждений. Некоторые из примеров показаны ниже.

В функции yywrap': /src/parser.y:12: multiple definition ofyywrap' server.o :/src/parser.y:12: сначала определено здесь utils.o:

В функции yyparse': /src/y.tab.c:1175: multiple definition ofyyparse' server.o:/src/y.tab.c:1175: сначала определено здесь utils.o

Я получаю много разных ошибок, относящихся к разным файлам yy_***. Я успешно скомпилировал с несколькими вызовами yyparse в прошлом, но на этот раз, похоже, все по-другому. Это очень похоже на проблему включения где-то, но я не могу сказать, что это такое. Все мои заголовочные файлы также имеют условия ifndef.

Спасибо за вашу помощь!


person user297756    schedule 21.03.2010    source источник
comment
Традиционно включать код C, сгенерированный Lex и Yacc, в один файл, но это можно сделать, если это делается только в одном файле. Вы включаете заголовки только в другие файлы и только в том случае, если им действительно нужна информация из заголовков.   -  person Jonathan Leffler    schedule 21.03.2010


Ответы (1)


Вы должны компилировать y.tab.c и lex.yy.c, не включая их. Включайте файлы заголовков (.h) только в те исходные тексты, которые в них нуждаются.

Затем вы связываете полученные объектные файлы для создания исполняемого файла.

project: project.o t.tab.o lex.yy.o foo.o bar.o

y.tab.o: t.tab.c y.tab.h

lex.yy.o: lex.yy.c

# Assuming that you have correct pattern rules setup 
# or that the implicit rules will do...

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

y.tab.c y.tab.h: project.yacc
        $(YACC) $<

lex.yy.c: project.lex
        $(LEX) $<

или более сложные командные строки по мере необходимости.

person dmckee --- ex-moderator kitten    schedule 21.03.2010