9

アプリを作成したいのですが、複数のモジュールが複数のディレクトリに保存されています。私はこの考えに従うことにしました。つまり、各ディレクトリにmakefileを置き、それをマージすることにしました。しかし、-初心者プログラマーとして-私はまだそれを行う方法がわかりません。まず第一に、そのような「部分的な」makefileはどのように見えるでしょうか。バイナリごとに1つしか存在できないため、main関数を持つことはできませんが、コンパイルしようとすると、gccはmainへの未定義の参照について文句を言います。第二に、これらすべてのモジュールをまとめるとどのようになるかわかりません。

助けていただければ幸いですが、答えはシンプルにしてください。Makefileは、私にとってはまだ少し黒魔術です。

4

1 に答える 1

28

makefileで何かを行う前に、makefileなしでそれを行う方法を知っている必要があります。

gccを使用しているので、ソースコードはC++であると想定します。

ディレクトリ構造がどのように見えるかを教えていないので、2つのディレクトリに3つのソースファイルがあると仮定します:primary/main.cc、、。(後でのようにヘッダーファイルを処理できます。)そして、ビルドしたい。other/foo.ccother/bar.ccfoo.hmyApp

ステップ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.obeta/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を機能させて理解する必要があります。

于 2012-10-17T22:50:58.197 に答える