【问题标题】:Reuse makefile rule重用makefile规则
【发布时间】:2010-01-02 02:21:11
【问题描述】:

我正在学习 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 规则并带有一个额外的命令行参数,这似乎很糟糕。有没有更好的办法?

【问题讨论】:

    标签: makefile nmake


    【解决方案1】:

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

    debug:
        $(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe
    

    【讨论】:

    • 我这样做并得到:NMAKE : fatal error U1073: don't know how to make '" /D _DEBUG"'
    【解决方案2】:

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

    • $@ - 表示当前目标文件的名称,本例对应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 $ clobber : 清洁 mrproper 干净的: 德尔$(文件) 正确的: 删除 $(APP) 罢工>

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

    使 EXTRAFLAGS="/D _DDEBUG"

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

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

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 不应该是FILES = Exercise35.cpp吗?另外,为什么$(APP) 规则后面的分号?你不需要.PHONY: all clobber clean mrproper 规则吗?
    • @Mike:哎呀...那个分号...我会相应地编辑它... :(
    【解决方案3】:

    生日,

    我更倾向于将调试选项设为 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,那么我强烈建议您阅读“Managing Projects with GNU Make”的前几章。它将帮助您了解 make 行为的一些非直观方面,尤其是。这是反向链接行为。

    如果您能找到不那么具体 gmake 的小型第一版的副本,那就更好了。恕我直言,它的解释要好得多。

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

    HTH

    干杯,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多