2

yyparseの呼び出しを含むMakefileを使用してプログラムを正しくコンパイルする方法を知りたいですか?

これが私がすることです:

私はすべての通常のファイルをコンパイルする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 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条件があります。

ご協力いただきありがとうございます!

4

1 に答える 1

6

それらを含めずに、コンパイルする 必要があります。ヘッダーファイル(.h)は、それらを必要とするソースにのみインクルードしてください。y.tab.clex.yy.c

次に、結果のオブジェクトファイルをリンクして実行可能ファイルを生成します。

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) $<

または必要に応じてより洗練されたコマンドライン。

于 2010-03-21T05:58:11.253 に答える