Linux第65步_学习“Makefie”

1、在"/home/zgq/linux/"创建一个"Test_MakeFile"目录用于学习"Makefie"。

打开终端

输入"cd /home/zgq/linux/回车",切换到"/home/zgq/linux/"目录

输入"mkdir Linux_Drivers回车",创建"Linux_Drivers"目录

输入"cd Linux_Drivers回车"

切换到"/home/zgq/linux/Linux_Drivers/"目录

输入"mkdir TestMakeFile回车",创建"TestMakeFile"目录

输入"cd TestMakeFile回车"

切换到"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录

2、输入"vim main.c回车"

输入内容如下:

#include <stdio.h>

#include "Output.h"

int main(int argc, char *argv[])

{

printf("Hello main.c!\r\n");

My_Output();

}

输入"vim Output.c回车"

#include "Output.h"

#include <stdio.h>

///函数声明开始//

void My_Output(void);

///函数声明结束//

void My_Output(void)

{

printf("Hello Output.c!\r\n");

}

输入"vim Output.h回车"

#ifndef _OUTPUT_H

#define _OUTPUT_H

extern void My_Output(void);

#endif

3、输入"vim Makefie回车"

输入内容如下:

main: main.o Output.o

#生成"main"需要依赖"main.o和Output.o"

gcc -o main main.o Output.o

#将"main.o和Output.o"编译输出main

@echo Output main

#只输出Output main

main.o: main.c

gcc -c main.c

#编译"main.c"生成"main.o"

Output.o: Output.c

gcc -c Output.c

#编译"Output.c"生成"Output.o"

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

见下图:

改写Makefile,内容如下

objects = main.o Output.o

#将"main.o Output.o"的字符串赋值给objects

main: $(objects)

#$(objects)引用objects的值"main.o Output.o"

#生成"main"需要依赖"objects的值"

gcc -o main $(objects)

#$(objects)引用objects的值"main.o Output.o"

#将"main.o Output.o"编译输出main

@echo Output main

#只输出Output main

%.o : %.c

gcc -c $<

#依赖文件是以"%.c"定义的,所以"$<"表示所有".c"文件的集合

#将main.c和Output.c编译生成"main.o和Output.o"

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

4、编译

打开终端

输入"make回车"执行编译

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

输入"./main回车",运行main.exe

输入"make clean回车"清除工程

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

输入"make clean回车"执行编译

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

Makefie文件和C文件是位于同一个目录中,才可以使用这个"Makefile"。

1)、Makefle 中的"注释开头"要用符号"#"开头,不能使用C语言中的"//"和"/* */"。注意:"#"要顶格输入,否则会被当作一条语句;

2)、Makefile输出字符串使用"echo"

比如:

Print:

#必须以标号开始,否则不能用

@echo name

#只输出name

输入"make回车"

3)、Makefile中的变量值是字符串,比如:objects = XXX.o,表示objects的值是字符串"XXX.o";

4)、Makefile中变量定义:变量名 = xx,比如:objects = XXX.o,表示objects的值是字符串"XXX.o";

5)、Makefile中引用变量的方法是"(变量名)",比如:(objects)就表示引用了objects变量。

6)、赋值符":="不会使用后面定义的变量,赋值符"="会使用后面定义的变量。

举例如下:

name1 = V1

#给变量name1赋值为"V1"

name2 := $(name1)

#给变量name2赋值为"V1",它引用了name1变量

name3 = $(name1)

#给变量name3赋值为"V1",它引用了name1变量

name1 = V2

#给变量name1赋值为"V2"

#由于name2使用的赋值符为":=",所以name2的值保持不变

#由于name3使用的赋值符为"=",所以name3变成了"V2"

print:

@echo name3 = $(name3)

@echo name2 = $(name2)

@echo name1 = $(name1)

输入"make回车"

见下图:

7)、赋值符"?="

name1 = V1

#给变量name1赋值为"V1"

name2 = V2

#给变量name2赋值为"V2"

name1 ?= V3

#由于变量name1被赋值了,所以name1的值还是"V1"

name3 ?= V4

#由于变量name3没有被赋值,所以name3的值是"V4"

print:

@echo name3 = $(name3)

@echo name2 = $(name2)

@echo name1 = $(name1)

输入"make回车"

8)、变量追加"+="

objects = main.o inpiut.o

#将字符串"main.o inpiut.o"赋值给变量objects

objects += calcu.o

#将字符串"main.o inpiut.o calcu.o"赋值给变量objects

print:

@echo objects = $(objects)

输入"make回车"

9)、目标名: 依赖文件,比如:"main: main.o input.o",表示目标名main需要依赖"main.o input.o"文件;

注意:

需要"依赖文件的目标名"都是要生成文件。

目标名不需要依赖文件,是伪目标,也可以使用".PHONY : XXX"将"XXX"目标名指定为伪目标。

举例Makefile文件如下:

objects = main.o Output.o

#将"main.o Output.o"的字符串赋值给objects

main: $(objects)

#$(objects)引用objects的值"main.o Output.o"

#生成"main"需要依赖"objects的值"

gcc -o main $(objects)

#$(objects)引用objects的值"main.o Output.o"

#将"main.o Output.o"编译输出main

@echo Output main

#只输出Output main

.PHONY : clean

#声明 clean为伪目标

%.o : %.c

gcc -c $<

#依赖文件是以"%.c"定义的,所以"$<"表示所有".c"文件的集合

#将main.c和Output.c编译生成"main.o和Output.o"

MyPrint:

@echo Do MyPrint

#只输出Do MyPrint

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

10)、按"TAB键"后,输入的是"命令",它用来创建"Shell进程";

11)、Makefle代码中"行首需要空出",必须使用"TAB键",不能使用"空格键";

12)、当"%"出现在"目标名"中的时候,则目标名中"%所代表的值"取决于依赖文件中的"%"值

%.o : %.c #所有以".c"结束的文件,目标名中的"%.o"的"%"和所有以".c"结束的文件名保持一致。

这个用法,参考前面改写Makefile的介绍。

相关推荐
晨非辰17 分钟前
#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio
xiaoxiaoxiaolll1 小时前
期刊速递 | 《Light Sci. Appl.》超宽带光热电机理研究,推动碳纳米管传感器在制药质控中的实际应用
人工智能·学习
励志码农2 小时前
JavaWeb 30 天入门:第二十三天 —— 监听器(Listener)
java·开发语言·spring boot·学习·servlet
DisonTangor2 小时前
字节开源 OneReward: 通过多任务人类偏好学习实现统一掩模引导的图像生成
学习·ai作画·开源·aigc
黎宇幻生3 小时前
Java全栈学习笔记33
java·笔记·学习
2501_926227944 小时前
.Net程序员就业现状以及学习路线图(五)
学习·.net
奔跑吧 android4 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
NiKo_W6 小时前
Linux 文件系统与基础指令
linux·开发语言·指令
Darkwanderor7 小时前
Linux 的权限详解
linux
Luna-player7 小时前
快速开发一类似个人网站空间的工具使用什么方式比较好,比如网页或者个Windows程序,并且使用什么技术开发比较好,区别优势局限性,分别说明一下
经验分享