对于多个.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) *~

##################################################