Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2023学习日志

2023学习日志

原创
作者头像
TomoriNao
发布于 2023-06-08 13:57:08
发布于 2023-06-08 13:57:08
2050
举报
文章被收录于专栏:每月技术成长每月技术成长

Makefile

Makefile基本规则

代码语言:text
AI代码解释
复制
target ……:prerequisites ……
recipe
……

target

可以是需要生成的目标文件可执行文件或一个标签

prerequisites

是生成该target所依赖的文件或者其他target

recipe

是生成该target所需要的任意shell命令(真正执行的部分)

当prerequisites 被更新时,运行make命令,则会重新运行recipe中对应的shell命令

示例

代码语言:text
AI代码解释
复制
edit : main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
    cc -o edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o

main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h buffer.h
    cc -c display.c
insert.o : insert.c defs.h buffer.h
    cc -c insert.c
search.o : search.c defs.h buffer.h
    cc -c search.c
files.o : files.c defs.h buffer.h command.h
    cc -c files.c
utils.o : utils.c defs.h
    cc -c utils.c
clean :
    rm edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o

代码中,edit为待生成的可执行文件,其依赖与main.o、kbd.o等一堆‘.o’文件,而这些‘.o'文件又各种依赖于其他文件。因此,运行make命令时,将会根据文件的依赖关系,逐步生成targetprerequisites,再运行target对应的recipe

clean

值得注意的是,代码中的clean并非可执行文件目标文件,而是一个动作,类似于一个lable,在make时不会自动执行,需要显式输入make clean才能运行该target对应的recipe

此外,clean 更加规范的写法是,

代码语言:text
AI代码解释
复制
.PHONY: clean
clean: 
    -rm edit main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o

.PHONY表示clean伪标签,而-rm表示当shell命令出错时继续运行,删除其他文件

makefile中使用变量

示例

代码语言:text
AI代码解释
复制
objects = main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o

edit : $(objects)
    cc -o edit $(objects)

make自动推导

示例

代码语言:text
AI代码解释
复制
main.o : defs.h

make会自动将与'.o'文件同名的'.c'文件加入依赖中

包含其他makefile

示例

代码语言:text
AI代码解释
复制
include foo.make *.mk $(bar)

可以使用include命令将其他makefile引入makefile中,include命令会将指定makefile文件插入到include命令的位置,因此需要注意include命令的位置

通配符

可以使用‘*、?、 ~’三个通配符

文件搜寻

示例

代码语言:text
AI代码解释
复制
VPATH = src:../headers
vpath %.h ../headers

可以使用特殊变量 VPATHvpath关键字来设置搜索目录

多目标与静态模式

比较复杂,还需要复习

自动生成依赖性

通过recipe自动生成文件的依赖关系,依赖关系放到对应的.d文件中

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
跟我一起写 Makefile(二)
    1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。     2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。     3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。     4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)     5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
全栈程序员站长
2022/08/20
2420
跟我一起写 Makefile(一)[通俗易懂]
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
全栈程序员站长
2022/07/01
2990
跟我一起写Makefile
makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序。 首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感性认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是: 1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。 2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件
_gongluck
2018/03/08
1.1K0
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
第一部分、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,ma
嵌入式Linux内核
2022/09/22
3.4K0
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
跟我一起写Makefile:MakeFile介绍
http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D
bear_fish
2018/09/19
1K0
Makefile经典教程(掌握这些足够)
makefile很重要       什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
bear_fish
2018/09/20
2.8K0
makefile
target是一个object file,可以是一个执行文件,也可以是一个标签preerquisites是依赖的文件command是shell命令
Heeler-Deer
2023/02/22
1.1K0
Linux 开发 | 学习 Makefile
Make 是控制工程中通过源码生成可执行文件和其他相关文件的工具。Make 通过 Makefile 获取如何编译、链接和安装清理工程的信息。
orientlu
2018/09/13
5.5K0
「薅」52图初探Linux通用知识
知道上了研究生到了实验室,我发现实验室的怎么都是对着一个窗口操作,瞬间觉得以前的计算机知识白学了,于是开启了Linux之路。
我是程序员小贱
2020/11/17
1.6K0
「薅」52图初探Linux通用知识
什么是makefile(3)
六、另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的makefile吧。 objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) $(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h .PHONY : clean clean : rm edit $(objects) 这种风格,让我们的makefile变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,一是文件的依赖关系看不清楚,二是如果文件一多,要加入几个新的.o文件,那就理不清楚了。
py3study
2020/01/08
5930
makefile介绍 通俗易懂
在学习Makefile之前,首先介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。
用户8418197
2021/08/29
8890
Makefile的详细介绍和使用
参考链接1:https://seisman.github.io/how-to-write-makefile/invoke.html
乱码三千
2021/08/24
6190
Make 命令教程
代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。 Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,
ruanyf
2018/04/13
2.1K0
Make 命令教程
Make 快速入门
make 是 linux 系统的实用程序。它用于管理对于大型程序的自动编译任务,自动决定程序某一部分需要重新编译,并发出编译指令。虽然,我们最常见于 C 语言程序的编译。但是,make 不限于某一特定语言,凡是可以通过 shell 命令来运行编译器的语言都可以使用 make 。除此之外,你甚至可以用 make 描述任何构建任务,这些任务中,文件需要在其依赖的文件发生变动后自动更新。
我是一条小青蛇
2019/10/23
1.6K0
Makefile教程
Makefile定义了软件开发过程中,项目工程编译链、链接的方法和规则。 由IDE自动生成或者开发者手动书写。 Unix(MAC OS、Solaris)和Linux(Red Hat、Ubuntu、SUSE)系统下由make命令调用当前目录下的Makefile文件,实现项目工程的自动化编译。
恋喵大鲤鱼
2018/08/03
4.2K0
makefile文件编写「建议收藏」
makefile文件用于管理和组织代码工程的编译和链接,其不是可执行文件,其被make工具解析并完成相关动作,下面笔者将介绍makefile中常用的一些语法说明:
全栈程序员站长
2022/09/06
3.4K0
makefile文件编写「建议收藏」
深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
make 是一个在 Unix/Linux 系统中广泛使用的构建工具,用于自动化编译和构建项目。make 命令通过读取一个名为 Makefile 或 makefile 的文件,根据其中定义的规则执行各种任务(如编译、链接等),从而简化和自动化项目的构建过程。
Srlua
2024/10/30
7070
深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
【专业技术】linux下如何打造一个最简单的Makefile
相信在linux下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下。   下面是一个极其简单的例子: 现在我要编译一个Hello world,需要如下三个文件:  1. print.h       #include<stdio.h>       void printhello();   2. print.c       #include"print.h"       void printhello(){         p
程序员互动联盟
2018/03/14
8340
C++ 和 Makefile 笔记
比如工程目录下,将CPP文件放置在 src 目录下,H文件放在 header下,则makefile可以这样写
tonglei0429
2019/07/22
8790
C++ 和 Makefile 笔记
makefile从入门到放弃——博主吐血整理的笔记
在没有编写makefile之前可以使用命令gcc *.c -Wall查看当前代码是否有语法错误。检查没有语法错误以后可以编写makefile文件。
全栈程序员站长
2022/09/05
1.8K0
相关推荐
跟我一起写 Makefile(二)
更多 >
LV.3
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档