Makefile入门

Makefile入门

生如芥子,心藏须弥。

Makefile

一、什么是Makefile

1、Makefile

Makefile是一个文件,里面写的是项目的编译规则,它会根据文件的时间戳来推导本次编译的时候某些源文件是否需要重写编译,在项目程序中会有大量的不同文件需要同时编译,以及在后来需要修改部分文件时就不需要再把全部文件都编译一次了。

2、make

make是一个可执行程序,是专门用来make是解析Makefile文件的可执行程序
  make安装命令:sudo apt-get install make

二、Makefile的语法格式

1、语法格式1

makefile中使用 # 注释
标签必须顶格写,指令需要以一个 tab 开头

#标签名:
        #指令
order:
    ls -l

2、语法格式2

#目标:依赖               
    #编译的指令          
test:test.o
    gcc test.o -o test
test.o:test.s
    gcc -c test.s -o test.o
test.s:test.i
    gcc -S test.i -o test.s
test.i:test.c
    gcc -E test.c -o test.i

3、执行Makefile

(1)make

这种方式 make会自动在当前路径下找名为 Makefile 或者 makefile 的文件来执行,默认执行第一个标签下的指令。

(2)make 标签名

执行指定标签下的指令。

标签:分为目标、伪目标
目标:编译完成之后会生成目标对应的文件。
伪目标:编译完成之后不会生成目标对应的文件。

(3)make -f Makefilename

执行指定的Makefile文件。

三、Makefile中的变量

1、变量

与shell中的变量相似,没有变量类型直接赋值

#=  会将变量在Makefile中所有赋值的语句都找到
    将最后一次的结果赋值给新的变量
    VAL1=hello
    VAL2=$(VAL1)
    VAL1=1234
    all:
        ##echo 终端打印 相当于printf
        @echo $(VAL2)    # @表示取消执行时 指令的回显
        #结果 : 1234

#:=  立即赋值
    VAL1=hello
    VAL2:=$(VAL1)
    VAL1=1234
    all:
        @echo $(VAL2)     #结果 : hello

#+=  追加赋值  拼接
    VAL1=hello
    VAL1+=1234
    all:
        @echo $(VAL1)   #结果 : hello 1234

#?=  询问赋值
    ?前的变量是否已经被赋值过,如果赋值过,本次赋值不成立
    VAL1=hello
    VAL1?=world
    all:
        @echo $(VAL1)   #结果 : hello

2、特殊的变量

符号作用
$@目标文件
$^所有的依赖文件
$<第一个依赖文件

替换前:

hqyj:main.o network.o database.o file.o
    gcc main.o network.o database.o file.o -I ../include -o hqyj
main.o:main.c
    gcc main.c -I ../include -c -o main.o
network.o:network.c
    gcc network.c -I ../include -c -o network.o
database.o:database.c
    gcc database.c -I ../include -c -o database.o
file.o:file.c
    gcc file.c -I ../include -c -o file.o
clean:
    rm *.o  # * 是shell命令的通配符 表示通配任意长度的任意字符
    rm hqyj

替换后:

OBJ=main.o network.o database.o file.o
CC=gcc
TARGET=hqyj
INCLUDE=-I ../include 
FLAG=-c -o

$(TARGET):$(OBJ)
    $(CC) $^ $(INCLUDE) -o $@
%.o:%.c
	$(CC) $< $(INCLUDE) $(FLAG) $@
clean:
	rm $(OBJ) $(TARGET)

3、通配符

*:当makefile中需要执行linux命令的时候,表示linux命令的通配符,如 VAL=$(shell ls *.c) 表示将在当前路径执行 ls *.c 的结果 赋值给 VAL
%:它才是Makefile中的通配符 (通配任意长度的任意字符)

4、项目目录

目录文件内容
src存放源文件的 .c
include存放头文件的.h
obj存放目标文件.o
bin存放可执行文件a.out
cfg存放配置文件
log存放日志文件
lib存放库文件.so .a
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值