0

ディレクトリに cpp と hpp ファイルがいくつかあります./src。すべての cpp ファイルを 1 つのバイナリ ファイルにコンパイルします./bin/run。必要な場合、つまりヘッダーの 1 つが変更された場合にのみ再コンパイルします。

おそらく、変更された場合にのみファイルが再コンパイルされる Makefile を作成できますが、コードの大部分がヘッダーにあるため、非常に不快です。(製品はヘッダーそのもので、cpp ファイルはテストであるため、変更する予定はありません)。

.o一時ファイルを保存したい./build

機能は知ってg++ -MMいるが、使い方がわからない。

make必要ではなく、他の可能なシステムを使用するソリューションが十分に簡単である場合、私は喜んでいます。

UPD 明確にしようと思いますが、問題は次のとおりです。

新しいcppが作成されたり、インクルードが追加または削除されたりする可能性があります。毎回makefileを編集したくありません。

4

4 に答える 4

2

私が言及した問題を解決するために(-include良い解決策ではありません)、私は次のようなものを使用します:

build/%.o: %.cpp
    @$(CC) -MD -c -Wall -o $@ $<
    @cp build/$*.d build/$*.P
    @sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
         -e '/^$$/ d' -e 's/$$/ :/' < build/$*.P >> build/$*.d
    @rm build/$*.P

-include build/*.d

`%.d ルールは必要ありません。

編集:

@JackKelly は [ *cough*, *choke* ] で、同じ依存ファイルを効果的に取得するためのより良い方法を教えてくれました。

build/%.o: %.cpp
    @$(CC) -MD -c -Wall -o $@ $<
    @$(CC) -MM -MP -Wall -o $*.d $<

-include build/*.d

そうです、コマンドを持つルールが 1 つだけである限り、同じターゲットに対して複数のルールを設定できます。前提条件が蓄積されます。アイデアは、次のようなファイルを取得することです。

file.o: file.cpp headerfile.h
headerfile.h:

2 行目 ( ) は、前提条件やコマンドのないheaderfile.h:ルールです。headerfile.h何もしませんがルールなので が無ければheaderfile.hMake は成立します。

于 2012-10-12T22:56:33.157 に答える
1

g++ -MMあなたがやろうとしていることを行うことができる に言及します:

include $(ALLOBJ:%.o=%.d)

%.d: %.cxx
    @echo making dependencies for $<
    @g++ -MM -MP $(CXXFLAGS) $< -o $@
    @sed -i 's,$*\.o,& $@ ,g' $@

基本的に、これは.dファイルから.cxxファイルを作成するルールを定義します。これらの.dファイルは、includeステートメントによって必要とされ.oALLOBJ.

依存関係ルールの最後の行は、依存関係ファイルを自分自身で再生成させる「sed マジック」です。正規表現はせいぜいハックであり、ほとんどの場合悪であると考える場合は、フラグを使用-MTできます。

于 2012-10-12T20:20:20.757 に答える
1

ソリューションの概要は次のとおりです。

  • ソースファイルごとに補助的な依存関係ファイルを使用します (つまり、foo.depfor foo.cbar.depforbar.cなどを作成します) 。
  • gcc -MM依存ファイルの作成に使用
  • これを強制的makeに自動的に行うには、 and の前提条件として使用しfoo.cます。これには、出力にいくつかの小さな魔法が必要ですfoo.depfoo.osedgcc -MM
  • メインのメイクファイルにすべての依存ファイルを含めます。これは、このアプローチを可能にする重要なステップです。

最後のステップは次のように書かれています。

-include $(dependency_files)

これは非常に注意が必要ですが、可能です。詳細については、GNU make マニュアルを参照してください。

于 2012-10-12T20:18:38.070 に答える
0

これはMakeで行うことができます。必要なのは、ルールの機密性リストでヘッダーを指定することだけです。例えば

myfile.o: myfile.cpp
    gcc -c myfile.o myfile.cpp ${LDFLAGS}    # This is optional. make can infer this line.

になる

myfile.o: myfile.cpp myfile.h
    gcc -c myfile.o myfile.cpp ${LDFLAGS}    # Again, optional.

myfile.hこれで、変更があるたびmyfile.cppに再構築されます。同様の方法で、より多くのヘッダーをチェーンできます。

于 2012-10-12T20:05:01.130 に答える