我正在学习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
规则似乎很糟糕。还有更好的方法吗?
答案 0 :(得分:3)
递归make
,并将调试标记附加到CPPFLAGS
。
debug:
$(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe
答案 1 :(得分:1)
您应该查看制作的以下属性,并查看以下示例:
.SUFFIXES: .cpp.exe CPP = cl EXTRAFLAGS = 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 FILES = Exercise35 APP = Exercise35.exe .cpp.exe: $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) /c $< all : $(APP) $(APP) : $(FILES) $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) $@ $(FILES)clobber : clean mrproper clean: del $(FILES) mrproper: del $(APP)
我从旧的makefile模板中得到了这个,请注意make将显示为“智能”且灵活,因为你可以通过执行这样的方式覆盖一个make文件中专门用于调试/释放的标志
make EXTRAFLAGS="/D _DDEBUG"
这会将额外的define传递给makefile以包含_DDEBUG
宏,如果你想构建一个版本,请在命令行中省略EXTRAFLAGS。
修改强> 根据迈克的观点,我认为包含额外的规则是有用的,这样你就可以用exe和目标代码清理目录...这是我原来的模板makefile来自AIX(我在下面使用过) Linux也......)感谢迈克的抬头!
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分: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宏的版本。
BTW最好使用$ {}而不是$()来引用Makefile宏,因为圆括号用于将对象替换为归档,而大括号则不是。
编辑:如果您正在学习制作文件和制作文件,那么我强烈建议您阅读“Managing Projects with GNU Make”的前几章。它将帮助您了解make的行为的一些非直观方面,尤其是。它是向后链接的行为。
如果你能找到一个不那么具体的小版本的副本,那就更好了。它的解释要好得多恕我直言。
编辑2:以下是本书第一版的亚马逊网站链接,简称为“Managing Projects with Make”。正如我上面所说的那样,为什么make的行为与它的行为有很好的描述。
HTH
欢呼声,