1 安装Mingw
make文件是mingw32-make, 不是很方便,可以创建make的快捷方式
2 makefile 例子(编译JCVM CREF):
TARGET = cref VERSION = 1.0.0 CC = gcc # includes file INCLUEDS := -I ./h INCLUEDS += -I ./32 # C FLAGS CFLAGS := -Wall -DWIN32 \ -D_WIN32 \ -D_MBCS \ -D_CONSOLE \ -D_DEBUG \ -DBIT32 \ -DINTERFACE_T1 \ -luser32 \ -lgdi32 \ -lkernel32 \ -lmsvcrt \ -lwsock32
# source file contain SRC_FILES := ./c/*.c SRC_FILES += ./32/*.c OBJ_DIR = output SOURCES := $(wildcard $(SRC_FILES)) #wildcard 处理通配符符, 通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard” #OBJECT = $(patsubst %.c, %.o, $(SOURCES)) OBJECT := $(addprefix $(OBJ_DIR)/,$(notdir $(patsubst %.c,%.o,$(SOURCES)))) VPATH= ./c:./32 #Makfile 关键字,指定源文件搜索路径,%.C搜索的时候很关键 all: $(TARGET) # echo $(SOURCES) # echo "\r\n" all $(OBJECT) $(TARGET): $(OBJECT) @echo generate $(TARGET)_$(VERSION).exe #@ 不打印命令 @$(CC) $^ $(CFLAGS) -o $(TARGET)_$(VERSION).exe $(OBJECT): $(OBJ_DIR)/%.o: %.c # 静态模式,多目标, @echo building $< @$(CC) $(INCLUEDS) $(CFLAGS) -c $< -o $@ .PHONY : clean clean: del .\output\*.o #windows下面要用反斜杠 “\” del .\c\*.o del .\32\*.o |
静态模式:
态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:
: : ...
targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-pattern是指明了targets的模式,也就是的目标集模式。
prereq-patterns是目标的依赖模式,它对target-pattern形成的模式再进行一次依赖目标的定义。
这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。如果我们的定义成 %.o
,意思是我们的;集合中都是以 .o
结尾的,而如果我们的定义成 %.c
,意思是对所形成的目标集进行二次定义,其计算方法是,取模式中的 %
(也就是去掉了 .o
这个结尾),并为其加上 .c
这个结尾,形成的新集合。
所以,我们的“目标模式”或是“依赖模式”中都应该有 %
这个字符,如果你的文件名中有 %
那么你可以使用反斜杠 \
进行转义,来标明真实的 %
字符。
看一个例子:
objects = foo.o bar.oall: $(objects)$(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我们的目标从$object中获取, %.o
表明要所有以 .o
结尾的目标,也就是 foo.o bar.o
,也就是变量 $object
集合的模式,而依赖模式 %.c
则取模式 %.o
的 %
,也就是 foo bar
,并为其加下 .c
的后缀,于是,我们的依赖目标就是 foo.c bar.c
。而命令中的 $<
和 $@
则是自动化变量, $<
表示第一个依赖文件, $@
表示目标集(也就是“foo.o bar.o”)。于是,上面的规则展开后等价于下面的规则:
foo.o : foo.c $(CC) -c $(CFLAGS) foo.c -o foo.obar.o : bar.c $(CC) -c $(CFLAGS) bar.c -o bar.o
试想,如果我们的 %.o
有几百个,那么我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那会是一个很强大的功能。再看一个例子:
files = foo.elc bar.o lose.o$(filter %.o,$(files)): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@$(filter %.elc,$(files)): %.elc: %.el emacs -f batch-byte-compile $<
$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$files”集,只要其中模式为“%.o”的内容。其它的内容,我就不用多说了吧。这个例子展示了Makefile中更大的弹性。