Linux系统环境下C语言编程之一个简易通用Makefile的编写

在软件开发中,make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。它是一种转化文件形式的工具,转换的目标称为“target”;与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。

它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。

一、 Makefile的结构

下面的是维基百科上的例子,很棒的啊。

editor: main.o text.o
	gcc -o editor main.o text.o
main.o: main.c def.h
	gcc -c main.c
text.o: text.c com.h
	gcc -c text.c
install:editor
	mv editor /usr/local

二、 Makefile自动化变量

$<    第一个依赖文件的名称
$?    所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$@    目标的完整名称
$^    所有的依赖文件,以空格分开,不包含重复的依赖文件

三、 简易通用Makefile

####################################################
# Filename: Makefile                               #
# Usage:                                           #
#           C   source => CC = gcc and TYPE = .c   #
#           C++ source => CC = g++ and TYPE = .cpp #
####################################################

CC = gcc
TYPE = .c
CFLAGS = -Wall
APPNAME = netdev

OBJS = $(patsubst %$(TYPE), %.o, $(wildcard *$(TYPE)))

$(APPNAME): $(OBJS)
	$(CC) $^ $(CFLAGS) -o $@

$(TYPE).o:
	$(CC) -c $< $(CFLAGS) -o $@

clean:
	rm -f $(APPNAME) $(OBJS)

Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信 息,在make时会决定在链接的时候需要重新编译哪些文件。Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动发现最终的生成文件已经过时,而应该重新编译相应的模块。

Makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

Leave a Reply

Your email address will not be published. Required fields are marked *