関数 f() を ah ファイルで宣言し、bison ファイル y で定義し、.cpp ファイルで呼び出しました。
私はそれを次のようにコンパイルします:
g++ a.cpp a.tab.c lex.yy.c -o a
正常に動作しています。
今、私はこの関数 f() を b.cpp ファイルで呼び出したいと思います。
これどうやってするの。
b.cpp ファイルに含めるファイルと、コンパイル時に提供するファイル。
あなた#include "a.h"
と電話f()
。
どこa.cpp
から来たの?一般的に言えば、bison ファイルと別のプログラム ファイルに同じプレフィックスを使用すると混乱を招きます。関数がa.cpp
含まれているmain()
ようです (ただし、呼び出しに基づく推測にすぎg++
ません)。そのため、他のプログラムのオブジェクト ファイルとしては役に立ちません。私がすることは、次のようなものです。
bison -d -o parser.c parser.y
# For flex 2.5.4, you cannot put a space between -o and the filename.
# You should seriously think about upgrading to a non-prehistoric version
# flex -o lexer.c lexer.l
flex -olexer.c lexer.l
g++ -c -o parser.o parser.c
g++ -c -o lexer.o lexer.c
g++ -o a a.cpp parser.o lexer.o
g++ -o b b.cpp parser.o lexer.o
(上記は の名前を変更するa.tab.h
ので、lexer.l で修正する必要があります。ただし、これは単なる提案です。)