0

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

1) 为什么 DEPENDS 宏在右侧有特定信息?我认为目标文件仅依赖于 .h 文件?

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

3) 为什么我们在 CPPOPTIONS 中需要标志 -IstanfordCPPLib?我知道我们需要 LIB 的标志 -lStanfordCPPLib 因为这个宏指定了 .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)
4

1 回答 1

1

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

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

3)-IStanfordCPPLib表示目录StanfordCPPLib将用于包含搜索路径。它是必需的,因为编译器必须能够找到编译所需的包含RandomWriter.o

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

有关更多信息,请参阅GNU make 手册

于 2012-08-22T05:15:33.737 回答