2010-03-21 28 views
2

Je me demande comment compiler correctement un programme avec un Makefile qui a des appels à yyparse dedans?Confusion d'inclusion Yacc et Lex

C'est ce que je fais:

j'ai un Makefile qui compile tous mes fichiers réguliers et ils ont pas de relations à y.tab.c ou lex.yy.c (Suis-je censé les avoir?)

Je le fais au-dessus de mon code:

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

C'est ce qui se passe lorsque je tente de rendre le programme:

quand je viens de taper « make », il me donne beaucoup d'avertissements . Certains des exemples sont présentés ci-dessous.

En fonction yywrap': /src/parser.y:12: multiple definition of yywrap ' server.o: /src/parser.y: 12: tout d'abord défini ici utils.o:

En fonction yyparse': /src/y.tab.c:1175: multiple definition of yyparse' server.o:/src/y .tab.c: 1175: d'abord défini ici utils.o

Je reçois beaucoup d'erreurs différentes se référant à différents fichiers yy _ ***. J'ai compilé avec succès des appels multiples à yyparse dans le passé, mais cette fois semble être différent. Cela ressemble énormément à un problème d'inclusion quelque part, mais je ne peux pas dire de quoi il s'agit. Tous mes fichiers d'en-tête ont aussi des conditions ifndef.

Merci pour votre aide!

+0

Il est conventionnel d'inclure le code C généré par Lex et Yacc dans un seul fichier - mais cela pourrait être fait tant qu'il n'est fait que dans un seul fichier. Vous incluez uniquement les en-têtes dans d'autres fichiers et uniquement s'ils ont réellement besoin des informations des en-têtes. –

Répondre

6

Vous devriez être compilationy.tab.c et lex.yy.c, ne pas les inclure. N'incluez que les fichiers d'en-tête (.h) dans vos sources qui en ont besoin.

Ensuite, vous lier les fichiers objet résultant pour produire l'exécutable.

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... 

De plus, vous pouvez utiliser il pour que ces fichiers sont à jour par rapport il y a des fichiers générant:

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

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

ou plus sophistiquées lignes de commande au besoin.