对于多个.c文件来说编译比较麻烦,在这里我就给大家介绍一下makefile的编写。
Makefile 有三个非常有用的变量:$@,$^,$<。其意义为:
$@:目标文件
$^:所有的依赖文件
$<:第一个依赖文件
.c.o:表示所有的.o文件都依赖.c文件
这样Makefile就可以简化成如下:
##################################################
#Makefile example #
##################################################
CFLAGS = -I/usr/include/mysql
CC_FLAG = -g -O -Wall
DFLAGS = -L/usr/lib64/mysql/ -lmysqlclient $(CC_FLAG )
SUBSTR=server
OBJS =Main.o Info.o Change.o Process.o CryPtion.o Md5.o Request.o \
Journal.o DevInfodb.o
all:$(SUBSTR)
$(SUBSTR) : $(OBJS)
$(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY : clean
clean :
@echo "Removing linked and compiled files......"
-rm -rf $(OBJS) $(SUBSTR)
##################################################
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
.PHONY意思表示clean是一个伪目标。而在rm命令前面加了一个小减号的 意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要 放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。
编译文件夹
SUBDIR = phddns-2.3.0 ez-ipupdate-3.0.10
ddns :
for dir in $(SUBDIR) ; do [ ! -d $$dir ] || $(MAKE) -C $$dir && $(MAKE) -C $$dir update || exit 1 ; done
.PHONY : clean
clean :
for dir in $(SUBDIR) ; do [ ! -d $$dir ] || $(MAKE) -C $$dir clean || exit 1 ; done
单目录通用Makefile,如下如:
##################################################
#Makefile example #
##################################################
# EXECUTABLE为目标的可执行文件名, 可以根据具体的情况对其进行修改。
EXECUTABLE := test
# 修改隐含规则中宏
CFLAGS := -Wall -O2
LDFLAGS +=
# 列出工作目录下所有以“.c”结尾的文件,以空格分隔,将文件列表赋给变量SOURCE
SOURCE := $(wildcard *.c)
# 调用patsubst函数,生成与源文件对应的“.o”文件列表
OBJS := $(patsubst %.c, %.o, $(SOURCE))
# 编译所有".o"文件生成可执行文件
all : $(EXECUTABLE)
$(EXECUTABLE) : $(OBJS)
@$(CC) $(CFLAGS) $(OBJS) -o $(EXECUTABLE)
# 声明伪目标
.PHONLY : clean
# 删除所有中间文件和目标文件
clean :
@echo "Removing linked and compiled files......"
-rm -rf $(EXECUTABLE) $(OBJS) *~
##################################################