0

次のメイクファイルを書きましたが、何が起こっているのかよくわかりません (テンプレートの指示に基づいています)。次のメイクファイルを書きましたが、何が起こっているのかよくわかりません (テンプレートの指示に基づいています)。

1) DEPENDS マクロの右側に特定の情報があるのはなぜですか? オブジェクト ファイルは .h ファイルだけに依存していると思いましたか?

2) なぜ ARCH を指定する必要があるのですか?

3) CPPOPTIONS でフラグ -IStanfordCPPLib が必要なのはなぜですか? このマクロは、使用されるすべての .h ファイルを含む .a ファイルの場所を指定するため、LIB にフラグ -lStanfordCPPLib が必要であることは理解していますが、LIB が RandomWriter.o の依存関係として使用されない理由はわかりません。それから?

4) CPPOPTIONS と LDOPTIONS の重要性と機能についての説明もあれば幸いです。

PROGRAM = RandomWriter
OBJECTS = RandomWriter.o
DEPENDS = \
   RandomWriter.cpp \
   Makefile

ARCH = i386
CPPOPTIONS = -IStanfordCPPLib -arch $(ARCH) -fvisibility-inlines-hidden
LDOPTIONS = -LStanfordCPPLib -arch $(ARCH)
LIB = -lStanfordCPPLib

all: $(PROGRAM)

RandomWriter : $(OBJECTS)
    g++ -o $(PROGRAM) $(LDOPTIONS) $(OBJECTS) $(LIB)

RandomWriter.o : $(DEPENDS)
    @touch console.h
    g++ -c $(CPPOPTIONS) RandomWriter.cpp
    @rm console.h

clean:
    rm -f *.o *.a $(PROGRAM)
4

1 に答える 1

1

1) オブジェクトファイルは、それをコンパイルするために使用されるものに依存します。この場合、ヘッダーファイルが存在しない可能性があると思われます。そうでない場合、依存関係はヘッダー.cpp ヘッダーにあります。ヘッダーがある場合は、依存関係に追加する必要があります。

2) ARCH を使用すると、異なるアーキテクチャ ファミリのターゲット用にコンパイルできます。たとえば、64 ビット対 32 ビット。ARCHクロスコンパイルにも使用される場合があります。その場合、 はコンパイラ フラグを使用するのではなくMakefile、 の値に基づいてツールチェーンを切り替えます(たとえば、のようなものにARCH置き換えます)。必要なターゲット アーキテクチャを確認し、これが必要かどうかを判断する必要があります。g++arm-linux-gnueabi-g++-arch

3)-IStanfordCPPLibディレクトリStanfordCPPLibがインクルード検索パスで使用されることを意味します。コンパイラがコンパイルに必要なインクルードを見つけることができる必要があるため、これが必要ですRandomWriter.o

4)CPPOPTIONSコンパイラ オプションのようにLDOPTIONS見え、リンク用のオプションのように見えます。前者はファイルのビルドに使用され.o、後者は実行可能ファイルのリンクに使用されていることがわかります。

詳細については、GNU make マニュアルを参照してください。

于 2012-08-22T05:15:33.737 に答える