5

我正在学习makefile,并且试图弄清楚如何重用规则。现在我有以下内容:

CPP = cl

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt

.SUFFIXES: .exe .cpp

Exercise35.exe:
    $(CPP) Exercise35.cpp $(CPPFLAGS)

debug:
    $(CPP) Exercise35.cpp $(CPPFLAGS) /D "_DEBUG"

debug规则本质上Exercise35使用额外的命令行参数重复该规则似乎很糟糕。有没有更好的办法?

4

3 回答 3

3

递归make,并将您的调试标志附加到CPPFLAGS.

debug:
    $(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe
于 2010-01-02T02:26:06.683 回答
1

您应该检查 make 的以下属性并查看下面的示例:

  • $@ - 表示当前目标文件的名称,在这种情况下它对应于 APP 的值。
  • $< - 表示比目标所依赖的目标更新的单个文件。
  • 美元?- 表示比目标所依赖的当前目标更新的文件列表。
.后缀:.cpp.exe
CPP = 分类
附加标志 =
CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /ZI /TP /errorReport:prompt

文件 = 练习 35
APP = 练习35.exe

.cpp.exe:
     $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) /c $<

全部:$(APP)

$(应用程序):$(文件)
     $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) $@ $(文件)

clobber : 清洁 mrproper

干净的:
     德尔$(文件)

正确的:
     删除 $(APP)

我从我的旧 makefile 模板中得到了这个,请注意 make 将显得“智能”和灵活,因为您可以通过这样执行来覆盖专门用于在一个 make 文件中调试/发布的标志

使 EXTRAFLAGS="/D _DDEBUG"

这会将额外的定义传递到 makefile 中以包含_DDEBUG宏,如果您希望构建一个版本,请在命令行中省略 EXTRAFLAGS。

编辑: 根据 Mike 的指出,我认为包含额外的规则会很有用,这样您就可以使用 exe 和目标代码清理目录......这是我来自 AIX 的原始模板 makefile(我已经在 Linux 下也使用过……)感谢 Mike 的提醒!

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-02T02:53:06.257 回答
0

天,

我更倾向于将调试选项设置为 Makefile 中的宏。

CPP = cl

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D \
    "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 \
    /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 \
    /nologo /c /ZI /TP /errorReport:prompt

#DEBUG = /D "_DEBUG"
DEBUG =

.SUFFIXES: .exe .cpp

Exercise35.exe:
    ${CPP} Exercise35.cpp ${CPPFLAGS} ${DEBUG}

然后注释掉不想使用的DEBUG宏的版本。

顺便说一句,最好使用 ${} 而不是 $() 来引用 Makefile 宏,因为圆括号用于将对象替换到档案中,而大括号则不是。

编辑:如果您正在学习 make 和 makefile,那么我强烈建议您阅读“使用 GNU Make 管理项目”的前几章。它将帮助您了解 make 行为的一些非直观方面,尤其是。这是反向链接行为。

如果你能找到一个不是 gmake 特定的小型第一版的副本,那就更好了。恕我直言,它的解释要好得多。

编辑 2:这是本书第一版的亚马逊网站链接,简称为“使用 Make 管理项目”。正如我上面所说,很好地描述了为什么 make 表现得如此。

高温高压

干杯,

于 2010-01-02T02:51:19.350 回答