make及makefile简单介绍

GUN make是一种代码维护工具。

make工具会根据makefile文件定义的规则和步骤,完成整个软件项目的代码维护工作。

一般用来简化编译工作,可以极大地提高软件开发地效率。

windows下一般由集成开发环境自动生成,

linux下需要由我们按照其语法自己编写。

make主要解决两个问题

一、大量代码的关系维护
大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护。
把项目维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动代码的合理编译。
二、减少重复编译时间
在改动其中一个文件的时候,能判断哪些文件被修改过,可以对该文件进行重新编译目标文件,节省编译时间。

makefile语法及其执行

目标:依赖文件列表
命令列表
1.目标:
通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称
2.依赖文件:
是用来输入从而产生目标的文件
一个目标通常由几个依赖文件
3.命令:
make执行的动作,一个规则可以含几个命令
有多个命令时,每个命令占一行

在代码文件目录下,新建makefile文件进行编辑

假设这里有一个源文件名为main.c的代码文件,头文件main.h

main:main.c main.h      //主目标
    gcc main.c -o main
clean:                  //伪目标
    rm main -rf;

编辑好makefile,在命令行输入make命令即可执行主目标也就是代码编译。
伪目标需要make命令+次要目标名:make clean,执行批量删除操作

假设现在有一个工程,需要编译多个源文件,有main.c 1.c 2.c main.h 1.h 2.h

main:main.o 1.o 2.o         //执行make命令找不到.o文件就会向下执行.o目标
    gcc main.o 1.o 2.o -o main
main.o:main.c main.h
    gcc main.c -o main.o
1.o:1.c 1.h
    gcc 1.c -o 1.o
2.o:2.c 2.h
    gcc 2.c -o 2.o
clean:
    rm main main.o 1.o 2.o -rf

分步编译为.o文件的好处在于一旦修改源文件,只会重新编译修改文件其他文件不会重新编译,在大型项目中就会大大节约编译时间。

makefile中出现的文件称之为假想目标
假想目标并不是一个真正的文件名,通常是一个目标集合或者动作
可以没有依赖或者命令
一般需要显示的使用make+名字 显示调用
all:exec1 exec2
clean:
rm *.o exec
install:
mv main /home

all: 1.c 2.c    //有了这条语句,可以同时执行1.c 2.c

1.c: 1.c
    gcc 1.c -o 1
2.c: 2.c
    gcc 2.c -o 2
clean:
    rm -rf 1 2
install:
    mv 1 2 /home

当工程源文件过多时,以上方法依然过于麻烦,因此引出了makefile变量,通过变量大大的减少了工作量。

cc=gcc
#cc=arm-linux-gcc
obj=main.o 1.o 2.o
target=main
cfalgs=-Wall -g

$(target):$(obj)
    $(cc) $(obj) -o $(target) $(cfalgs)
main.o:main.c
    $(cc) -c main.c -o main.o $(cfalgs)
1.o:1.c
    $(cc) -c 1.c -o 1.o $(cfalgs)
2.o:2.c
    $(cc) -c 1.c -o 1.o $(cfalgs)
clean:
    rm -rf $(obj) $(target)

@ 表示目标名字
^ 表示所有依赖文件的名字
< 表示第一个依赖文件的名字

cc=gcc
obj=main.o 1.o 2.o
target=main
cfalgs=-Wall -g

$(target):$(obj)
    $(cc) $^ -o $@ $(cfalgs)
main.o:main.c
    $(cc) -c $< -o $@ $(cfalgs)
1.o:1.c
    $(cc) -c $< -o $@ $(cfalgs)
2.o:2.c
    $(cc) -c $< -o $@ $(cfalgs)
clean:
    rm -rf $(obj) $(target)

当源文件特别多时通常用通配符%代表一个单词中的若干字符
ex:%.c

cc=gcc
obj=main.o 1.o 2.o
target=main
cfalgs=-Wall -g

$(target):$(obj)
    $(cc) $^ -o $@ $(cfalgs)
%.o:%.c
    $(cc) -c $< -o $@ $(cfalgs)
clean:
    rm -rf *.o $(target)

Original: https://www.cnblogs.com/left23333/p/16350150.html
Author: Left23333
Title: make及makefile简单介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582416/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据库_存储过程简介(oracle版)

    应朋友要求,写个存储过程说明,本篇比较简单,适合新接触存储过程的同学 先来个简单的 begin dbms_output.put_line(‘my first execute’); …

    Linux 2023年6月6日
    092
  • Redis 用的很溜,了解过它用的什么协议吗?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白…

    Linux 2023年5月28日
    0114
  • 多线程核心基础

    1 进程和线程 ​ 进程是OS分配资源的最进本的单位,线程是执行调度的最基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己的独立空间)。J…

    Linux 2023年6月14日
    0113
  • spingboot使用redis连接池报错

    配置如下,增加了连接池相关 redis: host: localhost port: 6379 database: 7 lettuce: pool: max-active: 20 …

    Linux 2023年5月28日
    091
  • [20220228]enq TX

    [20220228]enq TX – allocate ITL entry的测试3.txt –//上个星期的测试有点乱,重新规划测试. 1.环境:SCOTT…

    Linux 2023年6月13日
    092
  • Python垃圾回收和Linux Copy-on-Write机制

    前言 在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下。 Linux fork简介 fork是Linux提供的创建子进程的系统调用…

    Linux 2023年6月7日
    0127
  • 详解Docker 跨服务器通讯 Ambassador原理

    先看拓扑图:Ambassador 主要用来解决跨服务器通讯,因为同服务器通讯相对简单,直接用–link参数,或者用bridge网络即可。 服务器B的Docker2:ce…

    Linux 2023年6月6日
    0114
  • Windows下使用ffmpeg录制摄像头+录屏+录系统音+录麦克风音,生成本地视频或推流

    实操: 录屏: ffmpeg.exe -r 1 -f gdigrab -i desktop -vcodec libx264 out.mp4 录制麦克风声音和摄像头的视频: ffmp…

    Linux 2023年6月7日
    091
  • 其他

    1、【剑指Offer学习】【面试题01:实现赋值运算符函数】 2、【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】 5、【剑指Offer学习】【面…

    Linux 2023年6月13日
    084
  • [apue] 标准 I/O 库那些事儿

    标准 IO 库自 1975 年诞生以来,至今接近 50 年了,令人惊讶的是,这期间只对它做了非常小的修改。除了耳熟能详的 printf/scanf,回过头来对它做个全方位的审视,看…

    Linux 2023年6月6日
    0132
  • 分布式运算中,高精度校时器的畅想

    这是我写的,带有一定的娱乐性质的文章。你可以把它理解为神经病的yy。昨天,我看了个帖子《Facebook工程师开发开源自计时设备 仅需一个PCIe插槽即可工作》,有感而发写了此文。…

    Linux 2023年6月14日
    098
  • 面试之Java String 编码相关

    另有一篇我的字符编码本质入门的文章见这里:https://www.cnblogs.com/uncleguo/p/16008551.html 实话说,作为一个多年Java老年程序员,…

    Linux 2023年6月13日
    0119
  • LeetCode-210. 课程表 II

    题目来源 题目详情 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses – 1。给你一个数组 prerequisites ,其中 prerequis…

    Linux 2023年6月7日
    089
  • 理想汽车 x JuiceFS:从 Hadoop 到云原生的演进与思考

    理想汽车在 Hadoop 时代的技术架构 首先简单回顾下大数据技术的发展,基于我个人的理解,将大数据的发展分了4个时期: 第一个时期: 2006 年到 2008 年。2008 年左…

    Linux 2023年6月14日
    0100
  • linux三剑客之awk

    linux三剑客之awk 适用范围:awk主要是用来格式化文本。 语法格式:awk [参数] [处理规则] [操作对象] 参数 作用 -F 指定文本分隔符(不写默认是以空格作为分隔…

    Linux 2023年5月27日
    0112
  • 《拉钩课程 – 重学操作系统 – Linux 指令入门》

    1、进程是什么?进程是应用的执行副本。应用的可执行文件是放在文件系统里,把可执行文件启动,就会在操作系统里(具体来说是内存中)形成一个应用的副本,这个副本就是进程。 2、Linux…

    Linux 2023年5月27日
    0114
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球