Linux学习日记3——MakeFile

学习视频链接

[linux从零到精通] gcc和Makefile,多文件编译神器是怎么练成的,解放程序员的双手就这么简单_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1B4411F7EK?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click

「操作系统」编译,链接,装载_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xr4y1A7Vm?spm_id_from=333.337.header_right.fav_list.click

黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=45&spm_id_from=pageDriver

目录

一、编译过程

1.1 基础知识

1.2 测试

二、脚本语言:MakeFile

2.1 为什么使用脚本语言 MakeFile

2.2 简单的写法如下

2.3 变量

2.4 两个函数

2.5 自动变量:

2.6 模式规则

2.7 文件管理

2.8 如果 makefile 文件名不叫 makefile

2.9 只编译一个文件

三、补充

3.1 编译显示 / 关闭警告信息

3.2 gcc 链接头文件

3.3 编译、链接、装载

3.4 模拟执行指令


一、编译过程

1.1 基础知识

预处理:把 .h 和 .c 展开形成一个文件。直接替换 宏定义、头文件、库文件,生成 .i 文件

编译:.i 生成一个汇编代码文件 .s 文件

汇编:.s 生成一个 .o(.obj)文件

链接:.o 链接,windows 生成 .exe,linux 生成 .elf 文件

1.2 测试

C 语言编译器叫 gcc

C++ 编辑器叫 g++

1、 .h 、.c ——> .i

# 把 test.c 预处理成 hello.i
gcc -E test.c -o hello.i 

 生成了一个 700 行的预处理文件,其中大部分是前面导入的头文件

 2、编译  汇编  链接

# 编译 汇编 链接
gcc -S hello.i -o hello.S
gcc -c hello.S -o hello.o
gcc hello.o -o hello

# 执行
./hello

3、编译的四个部分合成为一步

gcc test.c -o test

 1000 个 .c 文件就很难去编译了,就需要使用 MakeFile 了。

二、脚本语言:MakeFile

2.1 为什么使用脚本语言 MakeFile

Linux C/C++ 必须要使用的一个编译脚本,只需要输入一个指令就能执行上述编译过程

2.2 简单的写法如下

1、案例1

# 是注释


# 第一层:显示规则
# 目标文件:依赖文件
# [tab]指令

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

2、完成编译以后,我们可以删除编译后的文件

# rm -rf test.o test.S test.i test
# 伪目标:.PHONY
.PHONY:
clear:
    rm -rf test.o test.S test.i test

# 为目标的好处:文件夹中有与clear同名的文件,不会影响到clear的执行

 可以只清除一部分:

.PHONY:
clearall:
    rm -rf test.o test.S test.i test
clear:
    rm -rf test.o test.S test.i

3、如果只修改了其中一个 .c 文件,执行 make 的时候只会重新编译修改了的那个 c 文件

4、案例2

文件夹中有以下六个文件

circle.c、circle.h、cube.o、cube.h、main.c、main.h

test:circle.o cube.o main.o
    gcc circle.o cube.o main.o -o test

circle.o:circle.c
    gcc -c circle.c -o circle.o

cube.o:cube.c
    gcc -c cube.c -o cube.o

main.o:main.c
    gcc -c main.c -o main.o


.PHONY:
clearall:
    rm -rf circle.o cube.o main.o test
clear:
    rm -rf circle.o cube.o main.o 

减号 - 表示出错依然执行(作用是,删除不存在文件时,不报错。顺序执行结束)

2.3 变量

# 第一层:显示规则
# 目标文件:依赖文件
# [tab]指令

# 第二层:变量   
# = (替换)   += (追加)   := (恒等于)
# 使用变量 $(变量名) 替换

TAR = test
OBJ = circle.o cube.o main.o
CC := gcc

$(TAR):$(OBJ)
    $(CC) $(OBJ) -o $(TAR)

circle.o:circle.c
    $(CC) -c circle.c -o circle.o

cube.o:cube.c
    $(CC) -c cube.c -o cube.o

main.o:main.c
    $(CC) -c main.c -o main.o


.PHONY:
clearall:
    rm -rf $(OBJ) $(TAR)
clear:
    rm -rf $(OBJ)

2.4 两个函数

用 src 替换所有 .c 文件

obj 为 src 中所有的 .c 替换为 .o 形成的一个字符串

2.5 自动变量:

$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表, 以空格隔开。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。

 

2.6 模式规则

现在可以方便拓展了

静态模式规则,指定生成 .out 的 .o 文件从加了 $(obj) 的文件里面去找

2.7 文件管理

2.8 如果 makefile 文件名不叫 makefile

可以使用:make -f 文件名

2.9 只编译一个文件

make xxx.c 

三、补充

3.1 编译显示 / 关闭警告信息

显示所有警告信息 gcc hello.c -o hello -Wall

禁止所有警告信息 gcc hello.c -o hello -w

3.2 gcc 链接头文件

-I 头文件地址

3.3 编译、链接、装载

编译 .c —> .o

链接 小模块.o —> 大模块.exe

装载 .exe 放入内存中

3.4 模拟执行指令

防止误删源码

加上 -n 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herb.dr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值