makefileで何かを行う前に、makefileなしでそれを行う方法を知っている必要があります。
gccを使用しているので、ソースコードはC++であると想定します。
ディレクトリ構造がどのように見えるかを教えていないので、2つのディレクトリに3つのソースファイルがあると仮定します:primary/main.cc
、、。(後でのようにヘッダーファイルを処理できます。)そして、ビルドしたい。other/foo.cc
other/bar.cc
foo.h
myApp
ステップ1:手作業で行う
これを1つのコマンドで行うには、次を使用します。
gcc -Wall primary/main.cc other/foo.cc other/bar.cc -o myApp
これにより、3つのソースファイルがコンパイルされ、バイナリオブジェクトが実行可能ファイルにリンクされますmyApp
。
ステップ2:分割して実行する(前のステップが完全に機能するようになるまで、これを試行しないでください)。
1つのコマンドでビルドする代わりに、ソースファイルをバイナリオブジェクトファイルにコンパイルする中間ステップを実行できます。
gcc -Wall -c primary/main.cc -o primary/main.o
gcc -Wall -c other/foo.cc -o other/foo.o
gcc -Wall -c other/bar.cc -o other/bar.o
これにより、、、が生成さalpha/main.o
れbeta/foo.o
ますbeta/bar.o
。オブジェクトファイルには関数が必要ないため、コンパイラは関数について文句を言ったりfoo
、関数bar
が不足したりすることはありません。次に、オブジェクトをリンクして実行可能ファイルにします。main()
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
ステップ3:ローカルで実行する(前のステップが完全に機能するようになるまで、これを試行しないでください)。
前のステップと同じですが、私たちはで行動しprimary/
ますother/
:
cd primary
gcc -Wall -c main.cc -o main.o
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
ステップ4:Makefileを使用する(前のステップが完全に機能するようになるまで、これを試みないでください。)
makefileにSTEP1を実行させることもできますが、それは実際には必要ありません。primary
次のように(つまりprimary/makefile
)にmakefileを書き込みます。
main.o:
gcc -Wall -c main.cc -o main.o
(fromtの空白はgcc...
TABです。)
今これを試してみてください:
cd primary
make
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
ステップ5:複数のMakefileを使用する(前のステップが完全に機能するようになるまで、これを試みないでください)。
書くother/makefile
:
both: foo.o bar.o
foo.o:
gcc -Wall -c foo.cc -o foo.o
bar.o:
gcc -Wall -c bar.cc -o bar.o
そして、あなたが構築しているトップディレクトリのmakefile myApp
:
myApp:
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
今これを試してみてください:
cd primary
make
cd ../other
make
cd ..
make
ステップ6:他の人を呼び出す1つのMakefileを使用する(前のステップが完全に機能するようになるまで、これを試みないでください)。
一番上のmakefileを編集します。
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
今試してみてください:
make
これらすべてが機能する場合、あなたが持っているのは大雑把ですが効果的なmakefileシステムです。補助輪を外す準備ができたら、多くの改良が可能です。
編集:
サブディレクトリ(例)に多数のソースファイルがありother/
、最上位のmakefileにリストを手動で保持したくない場合は、いくつかの方法で処理できます。これは1つです:
OTHER_SOURCES := $(wildcard other/*.cc)
OTHER_OBJECTS := $(OTHER_SOURCES:.cc=.o)
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o $(OTHER_OBJECTS) -o myApp
ただし、さらに合理化を試みる前に、これらのmakefileを機能させて理解する必要があります。