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

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

时间:2024-09-16 12:51:19浏览次数:3  
标签:bin 文件 Makefile make makefile 源文件 编译 Linux

make/Makefile

1.背景

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

2.概念

makeMakefile 是在类 Unix 系统(包括 Linux 和 macOS)中广泛使用的构建工具和技术。

  • make 是一个命令行工具或者说是一个程序,它的主要作用是根据用户提供的规则去编译和链接程序源代码。当你运行 make 命令时,它会查找一个名为 Makefile 或者 GNUmakefile的特殊文件,并遵循其中的规则来确定应该执行哪些操作。这些规则通常指示了如何基于源代码文件构建可执行文件或其他输出文件,以及在什么条件下(例如某些源文件发生变化时)才需要重新编译。

  • Makefile 是一个文本文件,其中包含一系列构建项目的规则和命令。它定义了源文件、目标文件、依赖关系以及用于构建项目的命令。

3.实例代码

在这里插入图片描述
例如:
在这里插入图片描述
在这里插入图片描述

补充:

  1. .PHONY

上面提过.PHONY:XXX后面的XXX总会被执行
在这里插入图片描述
makefile怎么知道我的程序是否需要被编译?
答:通过对比可执行文件和源文件的最近修改时间,若源文件最近修改时间比可执行文件新,则需要重新被编译,make可以被执行,否则make不能被执行。

  1. makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。

在这里插入图片描述
会发现上面makefile中首先执行的时code.o被链接,源文件中没有code.o,但最后仍然能被执行,原因就是makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。,可将这个过程理解为通过栈实现的过程
在这里插入图片描述
所以即使我们打乱上面的makefile文件中的依赖方法顺序,源文件依然能正常编译执行。
注意:最终要形成的文件一定要放在第一个。

  1. 我们要用的makefile

在这里插入图片描述

bin=mycode               # 定义变量 bin,其值为 mycode,表示最终生成的可执行文件名  
scr=code.c               # 定义变量 scr,其值为 code.c,表示要编译的 C 源文件名  

$(bin):$(scr)           # 定义了一个规则,目标(可执行文件)是 $(bin),依赖是 $(scr)  
   @gcc -o $@ $^        # 使用 gcc 编译器将源代码编译为可执行文件,“$@”代表目标文件名,“$^”代表所有依赖文件
   @echo "compiler $(scr) to $(bin)" # 执行完成后,输出编译信息  
.PHONY:clean            
clean:                   # 定义一个名为 clean 的目标,用于清理构建生成的文件  
   @rm -f $(bin)       # 删除 $(bin) 指定的文件  
   @echo "clean project..." # 执行完成后,输出清理信息

注意:
1.在 Makefile 中,命令前的 @ 符号是可选的,他的作用是阻止 make 工具在执行命令前输出该命令本身。这意味着当make 执行包含 @ 符号的命令时,终端只会显示命令的执行结果,而不会显示命令行命令。
2.要编译 code.c 文件,你可以在命令行中运行 make。要清理生成的文件,你可以运行 make clean
3.#makefile中的注释

标签:bin,文件,Makefile,make,makefile,源文件,编译,Linux
From: https://blog.csdn.net/2302_76561054/article/details/137994154

相关文章

  • Linux下通过命名管道实现进程间通信
    引入上一篇文章介绍了Linux中通过pipe创建匿名管道,并实现父子进程间通信的功能;当时我就提到了Linux中的另一种管道通信方式——命名管道,下面就来详细介绍一下;命名管道什么是命名管道命名管道(NamedPipe),也叫FIFO(FirstInFirstOut),是一种用于进程间通信(IPC)的机制。与匿名管......
  • 5.linux磁盘管理
     目录一.基本分区1.磁盘简介2.管理磁盘a.查看磁盘信息b.创建分区-MBRc.创建文件系统-格式化d.挂载mounte.查看挂载信息3.扩展二.逻辑卷LVM1.创建LVM2.VG管理3.LV扩容三.交换分区管理Swap1.简介2.查看当前的交换分区3.增加交换分区4.扩展点一.基本......
  • Linux内存管理知识-一篇文章了解堆和栈区别(进阶篇)
    前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点:(1)管理方式不同栈编译器自动管理,无需程序员手......
  • Kali Linux 2024.3 发布下载 - 领先的渗透测试发行版
    KaliLinux2024.3发布(Multipletransitions)-领先的渗透测试发行版ThemostadvancedPenetrationTestingDistribution请访问原文链接:https://sysin.org/blog/kali-linux/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgKaliLinux2024.3已经可以下载,发行......
  • Linux查看服务器日志
    一、tail这个是我最常用的一种查看方式用法如下:tail-n10test.log查询日志尾部最后10行的日志;tail-n+10test.log查询10行之后的所有日志;tail-fn10test.log循环实时查看最后1000行记录(最常用的)一般还会配合着grep用,(实时抓包)例如:tai......
  • linux下安装部署Maven
    目录版本对应关系安装maven配置maven验证版本对应关系不同版本下载地址:https://archive.apache.org/dist/maven/Maven与JDK版本的对应关系主要取决于Maven的版本和所需的Java版本。以下是具体的对应关系:Maven2.0.11及以下版本支持JDK1.3和JDK1.4。Maven2.0.11及以上版......
  • linux下安装部署Node
    目录node下载二进制包验证node由于管理后台要求构建工具Node>=12,所以我们就选用最接近此版本的Node-v12.18.3TLS(稳定版本)下载二进制包#!/bin/bashyuminstallgzip-y[-d/data/setup/]||mkdir-p/data/setup/[-d/data/prog/]||mkdir-p/data/prog/......
  • linux下安装部署jenkins
    目录环境准备jdk安装安装依赖安装jenkins启动jenkins查看初始密码更换源汉化环境准备jdk安装1.8版本安装#!/bin/bash[-d/data/setup/]||mkdir-p/data/setup/[-d/data/prog/]||mkdir-p/data/prog/cd/data/setup/[-f/data/setup/jdk-8u271-linux-x64.......
  • Linux
    1.‌cd‌:用于切换当前工作目录。例如,cd/切换到根目录,cd..切换到上一级目录。2.‌ls‌:列出当前目录下的文件和子目录。例如,ls-l以详细格式显示文件和目录的权限、所有者、大小等信息。3.‌pwd‌:显示当前工作目录的路径。‌4.mkdir‌:创建新的目录。例如,mkdirnewdir创建一......
  • linux下部署安装gitlab
    目录安装依赖安装gitlab更改配置初始化启动gitlab设置密码汉化安装依赖#gitlab安装echogitlab>/etc/hostnamehostnamegitlabyuminstall-ycurlpolicycoreutilsopenssh-serveropenssh-clientspolicycoreutils-pythonyuminstall-ypostfix安装gitlabwgeth......