8

私は定期的にヘッダーを変更するプロジェクトを持っていますが、そうすると、それを忘れるとmake cleanmakeあらゆる種類の奇妙な動作が発生します。現在、Qt Creator を IDE として使用していますが、Qt に依存しないプロジェクトでこれが発生するのを見てきました。私のプロジェクトはかなり大きくなり、ヘッダーを変更するたびに再構築する必要があり、非生産的になっています。何かご意見は?

今後の参考のために:

QMake システムを使用している場合:

DEPENDPATH += . \
    HeaderLocation1/ \
    HeaderLocation2/ \
    HeaderLocation2/HeaderSubLocation1/ \
    HeaderLocation2/HeaderSubLocation2/ \
    HeaderLocation2/HeaderSubLocation3/ \
    HeaderLocation2/HeaderSubLocation4/ \
    HeaderLocation2/HeaderSubLocation5/ \
    HeaderLocation3/ \
    HeaderLocation3/HeaderSubLocation1/ \
    HeaderLocation3/HeaderSubLocation2/ \
4

5 に答える 5

5

再実行しqmakeます。これにより、適切な依存関係を持つ新しい Makefile が生成されます。

例:

file.h次のようなファイル:

#include "some.h"
#include "header.h"
#include "files.h"
...

次のfile.cppようになります。

#include "file.h"
...

そしてあなたの.pro

HEADERS += file.h some.h header.h files.h
SOURCES += file.cpp

結果に次のものが生成されますMakefile

file.o: ../src/file.cpp ../src/file.h \
        ../src/some.h \
        ../src/header.h \
        ../src/files.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o file.o ../src/file.cpp
于 2012-05-17T23:59:37.690 に答える
3

IDEについて何も知らず、関連性があるかどうかもわかりません。また、makefileを含めていないので、わかりやすいことを述べておきますが、自動生成された依存関係を使用していますか?

g ++の場合、-MDフラグを使用してから、makefileにインクルードします$(wildcard bin/*.d)(オブジェクトファイルが作成された場所に応じて、私のものは'bin'に作成されます)

また、クリーンビルドでdepファイルを削除してください

于 2012-05-17T14:45:05.810 に答える
2

解決策は、メイクファイルに適切なヘッダー依存関係を含めることです。

1) makedepend を使用して、依存ファイルを生成します。依存関係ファイルを再生成するターゲットをメイクファイルに追加し、実際にコンパイルを行う前にそれを呼び出したいとします。2) GCC のみ: .c/.cpp ファイルのコンパイル行で「-MMD」および「-MP」オプションを使用します。これにより、GCC は入力ファイルの依存ファイルを生成します。次に、これらをメイクファイルに含めることができます。ここでの利点は、これら 2 つのオプションを使用すると、ヘッダーを追加および削除するときに、期待どおりに動作することです。

于 2012-05-17T14:47:09.700 に答える
1

これは主にファイル間の依存関係が原因です。したがって、別のファイルに含まれている.hファイルを変更した場合は、そのファイルも再コンパイルする必要があります。したがって、インクルードを減らすか、可能であれば.h / .cpp形式でコーディングして、.hよりも頻繁に.cppを変更する必要があります。

于 2012-05-17T14:39:42.717 に答える
1

これは、コンパイル中に自動的に作成された依存関係ファイルを生成および使用する、私自身のメイクファイルからの抜粋です。cpp ファイル用に追加のエントリを作成する必要があります

%.o : %.c
    $(CC) -M $(CFLAGS) -o $*.P $<
    @cp $*.P $*.d; \
            sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
                -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d; \
            rm -f $*.P
    $(CC) $(CFLAGS) -c $< -o $@

-include *.d

クリーン ビルドで delete *.d ファイルを追加することを忘れないでください

于 2012-05-17T14:58:53.857 に答える