Як и Лекс путаница включения - PullRequest
2 голосов
/ 21 марта 2010

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

Вот что я делаю:

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

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

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

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

Когда я просто набираю "make", это дает мне много предупреждений Некоторые примеры приведены ниже.

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

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

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

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

1 Ответ

6 голосов
/ 21 марта 2010

Вы должны быть компилировать 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) $<

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

...