如果有帮助,希望点赞支持,我会更有创作的动力哦
【针对评论 hj_try_1991 2022.08.08留言,文中个别书写错误已修正(2022/11/15)】
C语言中,我们使用visual studio开发软件时候,写程序开始时候都会创建一个project项目文件,然后在文件里面编译 .h 和 .c 的文件。
在Linux中,有一个叫make的东西,就相当于C语言的集成开发环境,我们只需要在make里面创建文件,写代码,make会帮我们管理这些文件。
不过我们创建的项目不叫project,而是称为Makefile,打开一个make源程序包,发现很多Makefile的文件,说明里面有很多的项目。
在源程序包里面,也有名为makefile的文件(m是小写),两个命名同时存在,这是合理的,在开发一个项目的时候,工程师一般都会命名为Makefile然后打包交给用户,用户觉得某个Makefile需要改动,用户改动后或者新建后的项目定义为makefile,并且在运行时候,先执行makefile,再执行Makefile文件。
touch main.c tool1.c tool1.h tool2.c tool2.h
使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
$ touch file #创建一个名为“file”的新的空白文件**
要有优秀的编程习惯,创建完了之后看一下时候创建成功
ls
ls 查看当前目录下的文件,发现成功创建了5个文件。
vim * -p
vim就是进入文本编辑的命令,按键 i 进入编辑模式,Esc退出编辑模式,:wq 保存退出到终端界面
"tool1.h"
#ifndef TOOL1_H__
#define TOOL1_H__
# 声明函数
void mytoo1(void);
#endif
"tool1.c"
#include
#incldue "tool1.h"
# 定义函数
void mytool1(void)
{
printf("tool1 print\n");
}
只需要稍微修改一下 tool2.h 和 tool2.c 的文件就好啦。
"tool2.h"
#ifndef TOOL2_H__
#define TOOL2_H__
# 声明函数
void mytoo2(void);
#endif
"tool1.c"
#include
#incldue "tool2.h"
# 定义函数
void mytool2(void)
{
printf("tool2 print\n");
}
现在还剩下一个主函数main了,测试代码如下
#include
#include "tool1.h"
#include "tool2.h"
int main(){
mytool1();
mytool2();
return 0;
}
:wa退出编辑模式(保存所有打开的文件)
rm a.out
vim进入编辑模式,系统检测没有名为makefile的文件,会自动创建。
如果自己想自定义一个其他名字,比如makefilebuff-demo,可能在make操作时候会有影响。下面会讲。
接下来的写依赖关系的时候,你可能会疑惑gcc命令的一些参数,nb我已经预判到了,我的这篇文章可以帮你解决一小部分疑惑
Linux——gcc -c -o 等参数的解释.
# 自定义依赖关系,源文件(后缀为.c)经过编译汇编生成目标文件(后缀为.o)
# 目标文件执行生成可执行文件(类似与mytool)
mytool:main.o tool1.o tool2.o
# 写gcc命令时候,前面要tab按键一下
# 不写-o参数,生成默认的可执行文件名为a.out,这里我们修改为mytool
gcc main.o tool1.o tool2.o -o mytool
main.o:main.c
#-Wall 可以看到所有的警告
#-g 可以调试
#-c 只允许执行到汇编步骤,不允许链接。
gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.c
gcc tool1.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
gcc tool2.c -c -Wall -g -o tool2.o
保存退出,然后查看一下目录(好习惯),发现有一个makefile的文件啦。
make -f makefilebuff-demo
make 命令可以通过 -f 执行使用的makefile。
如果在没有使用 -f 指定的情况下,会按照下面的顺序执行。
GNUmakefile, makefile 和 Makefile
可以看到可执行文件已经是其他颜色了,颜色不同代表这文件权限不同。
(./文件名)运行!
第一阶段就可以完结撒花啦!!!!!
实际上,这里的makefile文件的信息写的并不是十分的规范,有的东西还没有写,有的写的太麻烦。接下来逐步完善一下
_实际上,正如上面介绍的流程我们已经基本处理完了项目,这个时候我修改了某文件代码保存退出后,就需要重新的执行make指令,但是跟第一次不同的是,这次make指令执行后界面如图,不再展示依赖和被依赖关系。
_但是我们还是希望每次执行make,都展示一下依赖和被依赖关系,需要添加 clean 信息
clean:
# rm 删除指令,删除所有后缀为.o文件,删除mytool这个可执行文件
# -rf 强制删除并且递归删除,否则的话会一直询问我们是否需要删除
rm *.o mytool -rf
# OBJS 代替 依赖文件
# CC 代替 gcc
# CFLAGS 代替 编译命令
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $(OBJS) -o mytool
main.o:main.c
$(CC) main.c $(CFLAGS) -o main.o
tool1.o:tool1.c
$(CC) tool1.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c
$(CC) tool2.c $(CFLAGS) -o tool2.o
clean:
rm *.o mytool -rf
# $^ 代替 上面的指令
# RM 代替 rm -f
# $@ 代替 目标文件
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $^ -o mytool
main.o:main.c
$(CC) $^ $(CFLAGS) -o $@
tool1.o:tool1.c
$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
# 6-11行代码相似性很强,可以提取出一个公式模版
# %.o:%.c
# $(CC) $^ $(CFLAGS) -o $@
# 百分号相当于一个通配符
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $^ -o mytool
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
这次从零开始接触makefile,先查阅文本资料简单的接触一下makefile,留下了印象是好难读懂什么意思,痛苦几天后找到和视频资料并且写下了这篇总结,基本上可以对makefile有个较为全面的认识。