Linux下Makefile快速编写入门
2015-09-02 18:31
531 查看
(一)为什么要编写Makefile
我们自己平常在linux下编译源文件时,当然可以使用gcc -Wall -g main.c -o main这样的命令一个一个编译,但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,我们一个个编译是极其花费时间的,也是不可取的。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(二)Makefile的基本规则
Mackfile基本规则
Target ...: Dependencies ...
Command ...
说明:
1)目标(TARGET):即最终想要产生的文件,如:可执行文件,目标文件或中间文件等;目标也可以是要执行的动作,如clean,也称为伪目标(用.PHONY指定伪目标)。
2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。
3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序,如echo)。注意:每个命令行的起始字符必须为TAB字符!
如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。
(三)简单Makefile的编写
1.单级目录下的Makefile编写
我们只需要使用vi Makefile命令创建一个新的Makefile文件,等我们编写好后,只需要使用make 命令就可执行编译操作。这里我们创建两个.c文件,使用他们生成目标文件:
1.使用变量来代替01.o 02.o ,方便后文使用。
2.使用自动化变量简化一些操作
$@ 规则的目标文件名
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文件列表
3.使用make clean 命令即可执行删除操作
2.多级(二级)目录生成可执行文件的Makefile的编写
01 02 文件夹下分别有01.c 02.c ,并且和文件夹同级目录的有03.c,main是由这三个.c文件共同生成的,如何编写?
2.ROOTSRC=$(wildcard *.c) ROOTSRC代表当前目录下符合匹配模式的所有文件
3.SUBOBJ=$(SUBSRC:%.c=%.o) 生成.c对应的.o文件
以上就是这三个内嵌函数的使用方式。
3.多级(二级)目录下生成多个可执行文件
紧接上例,01文件下生成01可执行文件,02文件夹下生成02可执行文件,要求使用Makefile一个make命令完成。
这就需要我们在每个文件夹下编写自己的Makefile文件,最后使用文件夹目录的Makefile完成操作。
上面两个很好理解,最后的这个Makefile文件中,$(MAKE)代表make命令,TARGET默认是第一个即all,$(MAKE) -C(大写)代表进入到01 02的Makefile中,执行参数为TARGET的操作。
![](http://img.blog.csdn.net/20150902182831826?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当我们执行make clean时,TARGET即为clean
![](http://img.blog.csdn.net/20150902182839924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
更深入的内容请参考:http://blog.csdn.net/haoel/article/details/2886/
我们自己平常在linux下编译源文件时,当然可以使用gcc -Wall -g main.c -o main这样的命令一个一个编译,但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,我们一个个编译是极其花费时间的,也是不可取的。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(二)Makefile的基本规则
Mackfile基本规则
Target ...: Dependencies ...
Command ...
说明:
1)目标(TARGET):即最终想要产生的文件,如:可执行文件,目标文件或中间文件等;目标也可以是要执行的动作,如clean,也称为伪目标(用.PHONY指定伪目标)。
2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。
3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序,如echo)。注意:每个命令行的起始字符必须为TAB字符!
如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。
(三)简单Makefile的编写
1.单级目录下的Makefile编写
我们只需要使用vi Makefile命令创建一个新的Makefile文件,等我们编写好后,只需要使用make 命令就可执行编译操作。这里我们创建两个.c文件,使用他们生成目标文件:
.PHONY:clean OBJECTS=01.o 02.o main:$(OBJECTS) gcc -Wall -g $^ -o $@ 01.o:01.c gcc -Wall -g -c $< -o $@ 02.o:02.c gcc -Wall -g -c $< -o $@ clean: rm -f main $(OBJECTS)上面是相对简练的写法,我们一个个来解释:
1.使用变量来代替01.o 02.o ,方便后文使用。
2.使用自动化变量简化一些操作
$@ 规则的目标文件名
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文件列表
3.使用make clean 命令即可执行删除操作
2.多级(二级)目录生成可执行文件的Makefile的编写
01 02 文件夹下分别有01.c 02.c ,并且和文件夹同级目录的有03.c,main是由这三个.c文件共同生成的,如何编写?
.PHONY:clean all CC=gcc CFLAGS=-Wall -g BIN=main SUBDIR=$(shell ls -d */) ROOTSRC=$(wildcard *.c) SUBSRC=$(shell find $(SUBDIR) -name '*.c') SUBOBJ=$(SUBSRC:%.c=%.o) $(BIN):$(ROOTOBJ) $(SUBOBJ) $(CC) $(CFLAGS) $(ROOTOBJ) $(SUBOBJ) -o $(BIN) .c.o: $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)1.SUBDIR=$(shell ls -d */) 使用shell命令,将当前目录下所有的子目录赋给SUBDIR
2.ROOTSRC=$(wildcard *.c) ROOTSRC代表当前目录下符合匹配模式的所有文件
3.SUBOBJ=$(SUBSRC:%.c=%.o) 生成.c对应的.o文件
以上就是这三个内嵌函数的使用方式。
3.多级(二级)目录下生成多个可执行文件
紧接上例,01文件下生成01可执行文件,02文件夹下生成02可执行文件,要求使用Makefile一个make命令完成。
这就需要我们在每个文件夹下编写自己的Makefile文件,最后使用文件夹目录的Makefile完成操作。
01文件夹下的Makefile CC =gcc BIN =01 OBJS =01.o .PHONY: all clean print all:print $(BIN) print: @echo "----make all in $(PWD)-----" #$(BIN):$(OBJS) # $(CC) $(OBJS) -o $@ %.o:%.c $(CC) -c $< clean: @echo "----make clean in $(PWD)---" rm -f $(BIN) $(OBJS)
02文件夹下的Makefile (这里02文件夹下为.cpp文件) CXX =g++ BIN =02 OBJS =02.o CPPFLAGS =-Wall -g .PHONY: all clean print all:print $(BIN) print: @echo "-----make all in $(PWD)----" $(BIN):$(OBJS) $(CXX) $(CPPFLAGS) $(OBJS) -o $@ %.o:%.cpp $(CXX) -c $< clean: @echo "----make clean in $(PWD)----" rm -f $(BIN) $(OBJS)
文件夹同级目录下的Makefile文件 SUBDIRS =01 02 .PHONY:default all clean $(SUBDIRS) default:all all clean: $(MAKE) $(SUBDIRS) TARGET=$@ $(SUBDIRS): $(MAKE) -C $@ $(TARGET)
上面两个很好理解,最后的这个Makefile文件中,$(MAKE)代表make命令,TARGET默认是第一个即all,$(MAKE) -C(大写)代表进入到01 02的Makefile中,执行参数为TARGET的操作。
当我们执行make clean时,TARGET即为clean
更深入的内容请参考:http://blog.csdn.net/haoel/article/details/2886/
相关文章推荐
- Linux权限管理之ACL权限
- centos创建ftp方法,个人经验
- Linux中 qt 编译出现tslib错误
- linux 设置 tmpfs 大小
- linux定时任务的设置
- CentOS 7 + PHP 5.6.12
- linux C判断内核版本号
- 嵌入式linux之IIS驱动
- ARM Linux 3.x的设备树(Device Tree)
- Linux战地日记——Linux简介(锲子)
- Linux内核数据包处理流程-数据包接收
- C语言调用 Java(Linux)
- python linux下IP操作函数
- centos6.5搭建流媒体服务器
- linux for循环
- linux-pam
- 【Linux命令详解】8、Linux其他命令―(tty、startx、type)
- 如何通过SSH反向隧道,访问NAT后面的Linux服务器?
- linux rc.sysinit文件详解
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)