0

複数の .cpp および .h ファイルを含むプロジェクトがあります。すべての .cpp ファイルに含まれる Globals.h というファイルがあります。このファイルをコンパイルするとき、いくつかの -D オプションを使用します。これらのオプションは、Globals.h だけでなくすべてのファイルに影響します。

私のメイクファイルでは、すべてのファイルをコンパイルするときに同じ -D オプションを使用する必要がありました。もちろん、これらのオプションを削除すると、「未定義」のエラーが発生します。

つまり、これらのオプションの 1 つを変更するたびに、プロジェクト全体を再コンパイルする必要があります。これらのオプションを使用して Globals.h のみをコンパイルできる方法はありますか?

これは私のメイクファイルの一部です: Globals.o を作成する行:

Globals.o : $(GlobalsLib) $(GlobalsInc)
       g++ -c -Wall $(CodeDefined) $(UserDefined) $(GlobalsLib) -std=c++0x -o Globals.o

$(GlobalsLib)および$(GlobalsInc)はファイルへのパスでGlobals.hあり、Globals.cpp $(CodeDefined)および$(UserDefined)は -U および -D オプションです。このコードは、別の .o ファイルを作成するためのものです。

NT_FFT_Decomp.o : $(GlobalsLib) $(GlobalsInc) $(NT_DecompLib) $(NT_DecompInc)
       g++ -c -Wall $(CodeDefined) $(UserDefined) $(NT_DecompLib) -std=c++0x -o NT_FFT_Decomp.o

(NT_DecompLib) $(NT_DecompInc)ファイルへのパスでもあります。g++ コマンドに同じオプションを追加する必要があることに注意してください。そのあたりはあるのでしょうか?

4

1 に答える 1

0

いいえ、それはヘッダーの仕組みではありません。

ヘッダーは個別のコンパイル単位ではありません。おそらく、フラグを使用してすべてのファイルをプリコンパイルすると、これはより理にかなっています-E(私は思います)。.iこれにより、実際にコンパイルされる(私が思うに)たくさんのファイルが残ります。ヘッダーはなくなりましたが、その内容はさまざまなソース ファイルに分散していることに注意してください。これは、実際に毎回再コンパイルする必要があるものです。

ソースの再コンパイルを最小限に抑える方法があります。たとえば、この状況:

foo.h

int foo = 1;

これに変えることができます:

foo.h

extern int foo;

foo.cpp

int foo = 1;

fooしたがって、再コンパイルせずに の値を変更できるようになりました。

残念ながら、ヘッダーが大きすぎるようにも思えます。すべてを 1 つのヘッダーに入れると、多くの再コンパイルを行うことになります。より具体的に因数分解すると、これはより回避できる可能性があります。

また (または代わりに?)プリコンパイル済みヘッダーを使用して、コンパイル時間を短縮します。私は彼らを使ってプログラミングしたことはありませんが、彼らは私が理解しているこの問題を解決します。

于 2013-05-17T01:21:31.423 に答える