linux makefile教程,Makefile简单入门教程

一、简介

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序(简单将:管理工程的文件,决定先编译哪些文件,编译顺序)。

二、编写规则:

目标1:目标依赖  然后回车+tab键

命令;

目标2:目标依赖  然后回车+tab键

命令;

...

目标n:目标依赖  然后回车+tab键

命令;

注意:命令必须是tab键开头的。

三、Makefile演进

1、一个项目有main.c/a.c/a.h/b.c/b.h五个文件;main.c包含a.h和b.h并使用相关函数;然后建立一个新的Makefile文件,内容如下:

main:a.o b.o

gcc -o main a.o b.o

a.o:a.c

gcc -c a.c -o a.o

b.o:b.c

gcc -c b.c -o b.o

2、Makefile升级1

采用makefile变量:想用就用,没有类型,不需要定义(引用变量使用$(obj)来包含更多.o文件)

方法:obj:=a.o b.o

那么上面的Makefile程序升级如下:

obj:=a.o b.o

main:$(obj)

gcc -o main a.o b.o

a.o:a.c

gcc -c a.c -o a.o

b.o:b.c

gcc -c b.c -o b.o

3、Makefile升级2

经过以上两个makefile的编译,项目执行是成功的,但是如果main.c需要引用更多文件中的函数时,是否要填写那么多的编译命令吗?显然这个方法不可取。

改进:makefile特殊变量和自动推导功能

知识点说明:

$@  代表目标名,

$^  代表依赖文件

%  代表任意字符

%.o  代表任意.o文件

%.c  代表任意.c文件

以上Makefile升级如下:

obj:=a.o b.o

main:$(obj)

gcc -o main $(obj)

%.o:%c      #注释:模式通配,自动将.c文件编译成.o文件

gcc -o $@ -c $^    #注释:通配符

clean:

rm -rf *.o main

4、Makefile升级3

exe=main      #注释:最后的编译结果名字

obj:=main.o a.o b.o c.o   #注释:依赖文件

all:$(obj)

gcc -o $(exe) $(obj)

%.o:%.c

gcc -c $^ -o $@

clean:

rm -rf $(obj) $(exe)

以上程序看似没有什么问题的,但是clean有点瑕疵,要是也有一个文件叫clean那怎么办?如果make clean就没办法执行这条命令。

5、Makefile升级4

使用伪目标.PHONY来解决clean瑕疵问题,升级Makefile如下:

exe:=main

obj:=main.o a.o b.o c.o

all:$(obj)

gcc -o $(exe) $(obj)

%.o:%.c

gcc -c $^ -o $@

.PHONY:clean     #注释:声明clean是伪目标

clean:

rm -rf $(obj) $(exe)

注释#.PHONY:clean声明伪目标,避免当前目录存在名字为clean文件的时候命令不能执行的情况

6、Makefile升级5

有时使用的编译器可能是g++、gcc甚至是arm-linux-gcc。为了方便统一管理,最好开头定义一个变量来代表编辑器,然后在gcc命令上变成$(CC):

Makefile升级如下:

CC:=gcc    #注释:定义一个变量,表示当前编辑器为gcc

exe:=main

obj:=main.o a.o b.o c.o

all:$(obj)

$(CC) -o $(exe) $(obj)

%.o:%.c

$(CC) -c $^ -o $@

.PHONY:clean

clean:

rm -rf $(obj) $(exe)

基本上现在的Makefie可以编辑很多普通的程序了。秩序要对Makefile的文件名适当稍加修改即可。如果在比较大型的程序里面写Makefile会相对知识点多一点,比如添加静态库、动态库、线程等等;后续再做升级。

推荐一本书:GNU make中文手册(翻译整理:徐海兵)

0b1331709591d260c1c78e86d0c51c18.png

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值