c ++ makefile解释(其中使用的依赖项和宏)?

时间:2012-08-22 05:08:57

标签: c++ makefile

我写了下面的makefile,但我真的不明白发生了什么(我基于模板的指令)。我写了下面的makefile,但我真的不明白发生了什么(我基于模板的指令)。

1)为什么DEPENDS宏具有关于的特定信息     右侧?我以为目标文件只依赖于     .h文件?

2)为什么我们必须指定ARCH?

3)为什么我们在CPPOPTIONS中需要标志-IStanfordCPPLib?我明白我们需要旗帜 -lStanfordCPPLib for LIB,因为这个宏指定了.a文件的位置,该文​​件包含了所有.h文件,但是我不确定为什么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)

1 个答案:

答案 0 :(得分:1)

1)目标文件取决于用于编译它的任何东西。我怀疑在这种情况下可能没有头文件,否则依赖关系将在标头上的.cpp 上。如果您有标题,则应将其添加到依赖项中。

2)ARCH允许您编译不同体系结构系列的目标。例如,64位与32位。您可能会发现ARCH也用于交叉编译,在这种情况下,Makefile会根据ARCH的值切换工具链(例如,将g++替换为{ {1}})而不是使用arm-linux-gnueabi-g++编译器标志。您应该检查您想要的目标架构,并决定是否需要它。

3)-arch表示将在包含搜索路径中使用目录-IStanfordCPPLib。这是必需的,因为编译器必须能够找到编译StanfordCPPLib所需的包含。

4)RandomWriter.o看起来像编译器选项,CPPOPTIONS看起来像链接的选项。您可以看到前者用于构建LDOPTIONS文件,后者用于链接可执行文件。

有关详细信息,请参阅the GNU make manual