【Linux系统编程】项目自动化构建工具make/Makefile--2

简介: 【Linux系统编程】项目自动化构建工具make/Makefile--2

【Linux系统编程】项目自动化构建工具make/Makefile--1https://developer.aliyun.com/article/1424705

Makefile/makefile语法使用:      


1,.PHONY的使用


       当我们不想改变文件所对应的时间时进行连续编译,这时需要在Makefile/makefile文件中进行.PHONY修饰伪目标。


[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
.PHONY:code.exe    #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行
clean:                      #我们也可用.PHONY修饰clean目标,即.PHONY:clean,使其总是执行
    rm -f code.exe
code.exe:code.c  
    gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe


2,名称的替换


       在Makefile/makefile文件中可用 “ = ” 进行名称替换工作,使用别名时只需用 $(别名) 进行替换即可,如下:


#使用 = 进行名称的替换
   g=gcc
   o=-o
   c=code.c
   exe=code.exe
#使用别名替换,即:$(别名)
   .PHONY:$(exe)    #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行
   clean:
       rm -f $(exe)
   $(exe):$(c)  
       gcc $^ $(o) $@   # $@代表目标文件,$^代表依赖文件列表

3,语法推导


       在Makefile/makefile中,若存在多个依赖关系,当make运行其中一个依赖关系的依赖方法时,系统会先判断依赖关系中对应的依赖文件列表,并且对应的依赖文件不存在时,将会自动往下继续寻找,直到找到指定的命令来生成这个目标文件,若找不到,系统将会报出异常;若找到了,系统将会往上不断返回执行对应的指令,以便生成这个目标文件。如下:


[zhu@zhujunhao ~]$ vim makefile
[zhu@zhujunhao ~]$ cat makefile
code.exe:code.o
    gcc $^ -o $@
code.o:code.s
    gcc -c $^ -o $@
code.s:code.i
    gcc -S $^ -o $@
code.i:code.c
    gcc -E $^ -o $@


以上的makefile的工作流程是这样的:


首先,当你运行 make code.exe时,make会检查 code.exe是否已经存在。如果存在,make就不会重新编译。如果不存在,make会找到它的依赖文件code.o,若依赖文件code.o 不存在,系统将往下查找,运行指定的命令来生成这个目标文件。这个过程会一直继续,直到所有的目标文件都被生成。

然后,对于每个目标文件,makefile都会检查是否所有的依赖文件都已经被更新。如果是,那么目标文件就会被重新编译。这个过程会一直继续,直到所有的目标文件都被更新。 如果命令失败了或全部指令运行完之后目标文件还没有被更新,make会停止并显示错误信息。

      总的来说,makefile定义了如何将C语言源代码code.c编译成可执行文件code.exe的过程。在编译过程中,它首先将C语言源代码预处理为中间文件code.i,然后将中间文件编译为汇编文件code.s,接着将汇编文件code.s编译成二进制文件code.o,最后将二进制文件链接为可执行文件code.exe。

[zhu@zhujunhao ~]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code.exe


       可看出,Makefile/makefile的程序指令运行中,依赖关系如同栈结构中不断推导进栈,当查找到最终所以属的目标文件时,依赖关系中对应的依赖方法将会不断的出栈运行。这种形式就叫做makefile/Makefile的语法推到过程。


总:使用make和Makefile/makefile可以简化编译和构建程序的过程,只需要编写一个简单的Makefile/makefile文件,就可以自动化地编译和链接程序。同时,Makefile/makefile还可以在不同的平台上使用,使得程序的构建更加灵活和可移植。


相关文章
|
1天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
97 78
|
4天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
30 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
15天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
59 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
24天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
1天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
11 0
|
24天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
17 3
|
28天前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
30 1
|
12天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
关系型数据库 MySQL Linux
linux 的实用工具分享
做开发用Linux感觉比Windows在一些地方要好用(只是个人感觉,不想引战),在Linux中没有烦人的广告弹窗,没有动不动给你惊喜的Windows强制更新,而且Linux相对Windows要流畅,在低配的电脑上也很少卡顿.现在很多开发软件都有Linux版本,使用起来也算方便.当然,要是玩游戏等娱乐使用,还是Windows牛逼.我现在写代码基本都使用Linux.我用的Ubuntu18.04。
2070 0