Linux 学习笔记 - make

本文介绍了make作为管理编译工具的重要性,通过实例解析makefile的编写,包括目标依赖、变量使用、文件替换规则及提高编译效率的策略。同时强调了make在处理头文件变更时的局限性及其解决办法。
摘要由CSDN通过智能技术生成

1.了解make:
(1)除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令。
(2)编程过程中还需要使用那些很少而且很难记忆的编译选项。
(3)make是一种控制编译或者重复编译软件的工具。
(4)make可以自动管理软件的编译内容、方式和时机,从而使程序员把更多的精力集中在编写代码上。

在这里插入图片描述
2.简单的例子:
用vi编辑一个简单的makefile,内容如下:

start:
    gcc hello.c -o hello

输入make,makefile的内容执行了。
如果是makefile是其他名字,比如makefile1,则输入make -f makefile1

稍微复杂的makefile,内容如下:

start:hello.o
        gcc -o hello hello.o

hello.o:
        gcc -o hello.o -c hello.c

clean:
        rm -f hello.o

target start后面的hello.o代表其下的command依赖与hello.o这个target。所以make先执行了hello.o这个target下的command。

增加了target clean。
输入make clean,make会直接执行clean其下的command。
在这里插入图片描述

3.makefile: @ $的使用

CC=gcc #CC 就是 gcc 宏定义

start:hello.o
	@#使用变量的方式 $(变量名称)
	$(CC) hello.o -o hello -g 
	
	@#输出ok,@代表不输出指令本身
	@echo "-----------ok-----------" 

hello.o:
	$(CC) -c hello.c -o hello.o -g

clean:
	rm -f hello.o

在这里插入图片描述
4.增加变量SRCS、OBJS、EXEC,每个引用变量CC的地方的展开成变量的值

潜规则:
对于.o文件,变量名称OBJS
对于.c文件,变量名称SRCS

CC=gcc #CC 就是 gcc 宏定义
SRCS=hello.c
OBJS=hello.o
EXEC=hello

start:$(OBJS)
	@#使用变量的方式 $(变量名称)
	$(CC) $(OBJS) -o $(EXEC) -g 

	@#输出ok,@代表不输出指令本身
	@echo "-----------ok-----------" 

$(OBJS):
	$(CC) -c $(SRCS) -o $(OBJS) -g

clean:
	rm -f $(OBJS)

5.替代
OBJS=$(SRCS:.c=.o),意思是将SRCS变量中的.c替换为.o
等号两边不能有空格

CC=gcc #CC 就是 gcc 宏定义
SRCS=hello.c
OBJS=$(SRCS:.c=.o) #OBJS=hello.o
EXEC=hello

start:$(OBJS)
	@#使用变量的方式 $(变量名称)
	$(CC) $(OBJS) -o $(EXEC) -g 

	@#输出ok,@代表不输出指令本身
	@echo "-----------ok-----------" 

$(OBJS):
	$(CC) -c $(SRCS) -o $(OBJS) -g

clean:
	rm -f $(OBJS)

6 .SUFFIXES:.c .o
在这里插入图片描述

.SUFFIXES:.c .o

CC=gcc

SRCS=hello.c\
        test.c
OBJS=$(SRCS:.c=.o)
EXEC=hello

start: $(OBJS)
        $(CC) -o $(EXEC) $(OBJS) 
        @echo "------------------ok---------------"

.c.o:
        $(CC) -Wall -o $@ -c $< 

clean:
        rm -rf $(EXEC) $(OBJS)

用makefile,只有项目当中修改过的.c文件才编译,没有修改的.c文件不会重新编译,这样会大大的加快编译的效率和时间
make程序是根据.c和.o文件的最后修改时间来判断.c文件是否需要重新编译的。
不建议每次都把所有的.o文件都删除,因为这样会导致make重新编译项目当中所有的源文件.

容易犯的错误
make只关心.c文件和.o文件的时间差,并不关心.h文件和.c文件的时间差。如果出现项目当中只是修改了.h文件,但并没有修改.c的文件的情况,就需要将所有include这个.h文件对应的.c文件的o文件删除,强制让make重新编译.c文件.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值