百度了一圈全都在扯淡,谷歌搜到Stack Overflow和微软文档上的英文资料才弄明白。
nmake自己支持很智能的自动扫描,只需要写:
main.exe: *.c resource.RES @$(MAKE) $(**:.c=.obj) link $(**:.c=.obj) /OUT:$@
就大功告成!
其中$**的意思是依赖项,$@是生成目标;$(**:.c=.obj)是文本替换,把.c后缀换成.obj。如果是resource.RES的话它不会做任何替换。
nmake会自动把所有.c编译成.obj,有内置的功能!
注意这里我用了一个循环make的技巧。如果不用呢?不行,必须得用。
下面说一个看起来更简单,但是其实有小问题的方案二。
如果你直接写
main.exe: *.obj resource.RES link $** /OUT:$@
也可以编译,但是问题就是编译一次之后,你添加了一个新的.c文件,这个新的.c不会被继续编译。
因为最开始的时候目录下面没有.obj文件,所以你*.obj是可以的,make会知道把所有.c编译成.obj。
但是,第二次的时候,目录下面有第一次编译的那些.obj,*.obj就只是以前的那些了。你新的.c不会被继续编译。
所以这里才要用循环make,这样每次都会看所有*.c。