首页 > 系统相关 >Linux项目自动化构建工具 --- make/Makefile

Linux项目自动化构建工具 --- make/Makefile

时间:2024-04-04 19:59:39浏览次数:43  
标签:文件 依赖 Makefile make makefile func Linux 2.3

文章目录

make/Makefile文件

1 背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是—— “自动化编译” ,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

2 理解

2.1 创建执行代码

第一步: 首先先写一份c语言测试代码:

vim func.c

viim指令进行创建编写c文件,最后使用 :wq 保存退出:

在这里插入图片描述

2.2 创建makefile文件

第二步: 创建Makefile文件,并且进入vim编写内容

vim Makefile

内容如下:

func:func.o
	gcc func.o -o func
func.o:func.s
	gcc -c func.s -o func.o
func.s:func.i
	gcc -S func.i -o func.s
func.i:func.c
	gcc -E func.c -o func.i
.PHONY:clean
clean:
	rm -f func.i func.s func.o func

在这里插入图片描述

在这里插入图片描述

2.3 运行make指令

第三步: 使用make指令运行指定的文件

在这里插入图片描述

可以发现,目录中多出了许多编译的文件。

此时使用 ./ 运行执行文件是可以的:

在这里插入图片描述

对此:

2.3.1 依赖关系
  • 上面的文件 func ,它依赖 func .o
  • func .o , 它依赖 func .s
  • func .s , 它依赖 func .i
  • func .i , 它依赖 func .c
2.3.2 依赖方法
  • gcc hello.* -option hello.* ,就是与之对应的依赖关系
2.3.3 原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么

  • make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

    如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。

  • 如果func文件不存在,或是func所依赖的后面的hello.o文件的文件修改时间要比func这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。

  • 如果func所依赖的func.o文件不存在,那么make会在当前文件中找目标为func.o文件的依赖性,如果找到则再根据那一个规则生成func.o文件。(这有点像一个堆栈的过程)

  • 当然,你的C文件和H文件是存在的啦,于是make会生成 func.o 文件,然后再用 func.o 文件声明make的终极任务,也就是执行文件func了。

  • 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

  • make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

2.4 项目清理

  • 工程是需要被清理的

  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令—— make clean ,以此来清除所有的目标文件,以便重编译。

  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的

  • 可以将我们的 func 目标文件声明成伪目标,测试一下

在这里插入图片描述

标签:文件,依赖,Makefile,make,makefile,func,Linux,2.3
From: https://blog.csdn.net/qq_52725268/article/details/137174794

相关文章

  • 【Linux】网络基础常识
    文章目录1.网络常识1.0dhcp协议1.1ip地址,mac地址是什么?1.2你拿着手机是如何连接上wifi的?1.3数据,流量是什么?手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点上网的原理?1.5固定电话打电话的原理?智能手机打手机电话/语音电话/视频电话的原理?1.62g,5g有什......
  • linux驱动-17-input子系统
    1input子系统介绍按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。input子系统分为input驱动层、input核心层、input事件处理层,最终给用户空间提供可访问的设备节点。驱动层:输入设备的具体驱动程序,......
  • Kali Linux介绍
    KaliLinux是一个基于Debian的Linux发行版,主要用于数字取证和渗透测试。它是由OffensiveSecurity维护和资助的,每季度更新一次。KaliLinux最初是由OffensiveSecurity的MatiAharoni和DevonKearns通过重写BackTrack来完成的,而BackTrack也是他们之前编写的用于取证的Linux发行......
  • Make编译之编译32bit ffmpeg
    跨平台编译ffmpeg简述下载ffmpeg源码官网或者github下载使用脚本配置configurehi3798板子厂家提供的编译器,在编译ffmpeg时,必须禁用汇编才能通过使用脚本配置项如下:重要配置项--cross-prefix:使用跨平台工具链的前缀,就是去掉后面如gcc、g++的部分--enable-cross-com......
  • Metasploit Framework 6.4 (macOS, Linux, Windows) - 开源渗透测试框架
    MetasploitFramework6.4(macOS,Linux,Windows)-开源渗透测试框架Rapid7Penetrationtesting请访问原文链接:https://sysin.org/blog/metasploit-framework-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框架知识就是力量,尤......
  • 设备驱动-16-Linux 内核LED子系统
    1LED子系统介绍led子系统相关描述可在内核源码Documentation/leds/leds-class.txt了解。led子系统是一个简单的Linux子系统,在目录/sys/class/leds下展示该子系统设备,每个设备都有自己的属性:brightness:设置LED亮度,范围0~max_brightnessmax_brightness:最大亮度......
  • Make编译之编译32bit Qt
    使用Make指定工具链编译Qt简要叙述下过程,避免以后在遇到相似有大致思路顺序总结:获取工具链下载Qt源码;拷贝qtsrc/qtbase/mkspaces/一份文件夹;用实际使用的工具链名称重新命名上一步拷贝的文件夹;编辑重新命名后文件夹内的qmake.conf文件,使用指定的编译器绝对路径;在qtsrc/......
  • 在Linux中,如何查看和结束正在运行的进程?
    在Linux中,查看和结束正在运行的进程通常涉及到几个基础的命令行工具。以下是一些常用的方法:1.查看正在运行的进程:1.ps命令基本用法:ps可以显示当前终端会话的进程列表。ps显示所有进程:ps-e或ps-A显示系统中所有的进程。ps-e包含父进程ID(PPID)和进程树......
  • 在Linux中,进程和线程有何作用?
    在Linux操作系统中,进程和线程都扮演着关键角色,它们的设计目的是为了支持系统的并发性和资源共享,以及提高应用程序的性能和响应能力。进程的作用:资源隔离:进程是操作系统分配资源的基本单位,每个进程都有自己独立的地址空间,包括代码段、数据段、堆和栈,这样可以防止一个进程错误......
  • 【Linux】Ubuntu 文件权限管理
    Linux系统对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功,这也是Linux有别于Windows的机制,也是基于这个权限机制,Linux可以有效防止病毒自我运行。因为运行的条件是必须要有运行的权限,而这个权限在Linux是用户所赋予的。文件权......