私はコマンドラインを使ってフレックスと(実際には初めて)学んでいます。
私はテストプロセスを単純化するためにMakefileを作成しましたが、コマンドがなぜ反対なのかわかりません。
たとえば、端末の順序は次のとおりです。
flex test.l
これによりファイルが生成されます。lex.yy.c
次に、次をコンパイルします。
g++ lex.yy.c -ll -o test
Makefileは逆さまに読みます:
test: lex.yy.c
g++ lex.yy.c -ll -o test
lex.yy.c: test.l
flex test.l
もしそうなら、私が走ったときに正確に何が起こりますかmake
?
答え1
Makefile は次の形式に従います。 (すべてではありませんが、ほとんどの実装で必要なので、Makefileは常にスペースの代わりにタブを使用する必要がありますmake
。)
target: dependencies
operations to build target
- ターゲットはビルド/コンパイル/作成したいターゲットです。複数が存在する可能性があり、依存関係を最初に満たす必要がない限り、Makefileの順序でビルドする必要があります。これ最初ファイルの宛先が呼び出されます。基本ターゲット、
make
引数なしで呼び出すときにビルドしようとしています。 - 依存関係は、ターゲットを構築するために必要なさまざまな部分です。
このMakefileには2つの目標があります。
- テスト
- lex.yy.c
lex.yy.c
ビルドに必要な依存関係なので、最初test
からビルドされますtest.l
。作成したら、コンパイルする準備が整いましたtest
。デフォルトではmake
...:
- 構築してみてください
test
。 - 未解決の依存関係。
lex.yy.c
存在しないか更新されたので、まずビルドする必要があります。 - ビルドするジョブを読みます
lex.yy.c
。実行flex test.l
:lex.yy.c
構築されました。 test
すべての依存関係が満たされます。ランニングg++ lex.yy.c -ll -o test
。test
建設される。
追加情報:makefileについての詳細は、私がお勧めしますLinux開発プラットフォーム渡すラピックウレマン。第4章:GNU Makeを使う。
答え2
まず、呼び出しをターゲットにしますtest
。しかし、lex.yy.c
これは依存関係です。
したがって、実際に実行する前に、ターゲットとすべての依存関係を分析してください。最初のターゲットはですが、test
実行を開始する前にlex.yy.c
呼び出されます。