我写了下面的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)
答案 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。