makefile
一、gcc
gcc 是用来编译代码的编译器
编译完后有一些常见的输出文件
.a 静态库(文档)
.c 需要预处理的C语言源代码
.h C语言源代码的头文件
.i 经过预处理后的C语言源代码
.o 目标文件(经过汇编产生)
.s 经过编译后产生的汇编语言代码
编译过程
.c->.i->.s->.o
1、预处理 (.c->.i)
gcc -E hello.c -o hello.i
2、编译(.i->.s)
gcc -s hello.c -o hello.s
3、汇编(.s->.o)
gcc -c hello.c -o hello.o
4、链接(.o->可执行文件)把多个.o链接成一个可执行文件(ELF)
gcc hello.o -o myHello
二、makefile
Linux的过程都是自己可以控制的
在gcc中可以通过将.c文件编译成.o文件
那么如果有多个.c文件呢,这些都要编译成.o文件,这样需要输入多条指令去执行吗?
可以通过 makefile
makefile好处:自动化编译
make命令,需要一个makefile文件
在makefile文件中去告诉make命令需要怎样去编译和连接程序
makefile是一个文件形式的数据库文件,包含一些规则来告诉make处理哪些文件以及如何处理这些文件
makefile规则:
target:depend
command
target:目标,可以是一个中间文件,也可以是最终的执行文件
depend:依赖,指要生成目标文件所需要的文件或目标
command:make需要执行的命令(一定用tab键)
hello.i:hello.c
gcc -E -o hello.i hello.c //注意代码前面一定用table隔开
makefile执行顺序:
默认执行第一条,在执行第一条时,先找所有的依赖文件,如果没有,继续往下找有没有脚本能生成这个依赖文件,如果有就会先执行下面生成依赖文件的语句
test:prog.o code.o
gcc -o test prog.o code.o
prog.o:prog.c
gcc -c prog.c -o prog.o
code.o:code.c
gcc -c code.c -o code.o
clean: //clean:伪目标 清除.o文件
rm -f *.o test
makefile变量:
变量理解为字符串
OBJ = a b c 表示 OBJ 就是 a b c 这三个,不能改变了
OBJ := a b c 表示 OBJ 是 a b c 但可以用 += 再去追加
OBJ += d 表示 OBJ 变量添加了 d 这一个
变量引用:
$(变量名)
OBJ:=myadd.o mysub.o
OBJ+=myproject.o
myProject:$(OBJ)
gcc $(OBJ) -o myProject
myadd.o:myadd.c
gcc -c myadd.c -o myadd.o
mysub.o:mysub.c
gcc -c mysub.c -o mysub.o
myproject.o:myproject.c
gcc -c myproject -o myproject.o
clean:
rm *.o myProject
通配符:
通配符:% * ?
% 表示任意一个
* 表示所有
? 表示匹配一个未知的东西
最终代码:
#OBJ:=myadd.o mysub.o
#OBJ+=project1.o
#myproject:$(OBJ)
# gcc $(OBJ) -o myproject
#*.o:*.c
# gcc -c *.c -o *.o
#.MYDEL: //标签,没有实际用处,只是以便区分
#clean:
# rm -rf *.o myproject
#==================================
# $@表示目标文件
# $^表示依赖文件
target=myProject
OBJ:=myadd.o mysub.o
OBJ+=myProject.o
CC:=gcc
CFLAGS:=-c
LIB:=
$(target):$(OBJ)
$(CC) $^ -o $@ $(LIB)
*.o:*.c
$(CC) $(CFLAGS) $^ -o $@
.MYDEL: #标签,没有实际用处,只是以便区分
clean:
rm -rf *.o $(target)
标签:文件,gcc,OBJ,makefile,myproject,hello
From: https://www.cnblogs.com/Mr-black-7/p/17170150.html