热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux——makefile编写

文章目录一、为啥要编写makefile二、makefile的一些规则2.1基本格式2.2编写方式2.3一些规则三、makefile编写四、makefile其余用法一、为啥要编写ma


文章目录

  • 一、为啥要编写makefile
  • 二、makefile的一些规则
    • 2.1 基本格式
    • 2.2 编写方式
    • 2.3一些规则
  • 三、makefile编写
  • 四、makefile其余用法


一、为啥要编写makefile

目的很简单,减少我们的工作量啊。
在linux环境下,我们可以编译一个程序,可以用 gcc xxxxx.c 就行,但是编译多个文件呢。当然也可以,比如 gcc xx1.c xxx2.c … xxx99.c 这样就很麻烦,而且容易漏掉 ,所以为了避免这种问题,我们就需要使用makefile。你可以把makefile理解为自动编译文件。


二、makefile的一些规则


2.1 基本格式

target:components  
TAB conmand
.......
target:components  
TAB conmand
.....
....
target:components  
TAB conmand

第一行表示的是目标文件和依赖关系。第二行是命令。TAB就是一个TAB键。
你可能很迷糊,我现在也很迷糊,但是我们先记下来好伐。下面一一记录。
target:目标文件,可执行文件(如 clean)。
components:依赖文件,可以多个文件(.o 文件)。
command:命令(如 gcc)。


2.2 编写方式

我们来举个例子
假设我们现在有几个源文件,要求用一个makefile文件来编写。
源文件有:
mian.c
add.c add.h(add.c对应的头文件)
sub.c sub.h(sub.c对应的头文件)
通过倒叙方式来编写

//我们的目标是生成一个main文件,如何来生成一个main文件,就是依赖于main.o add.o sub.o这三个文件
main:main.o add.o sub.ogcc main.o add.o sub.o -o main
//但是源文件没有这三个 .o 文件,所以我们需要生成这三个.o文件。是不是 .o文件就成了目标文件呢,所以按照规则来写就是了
main.o:main.c add.h sub.hgcc -c main.c -o main.o
//这里.o 文件要一个一个写,这里有三个所以写三次
add.o:add.c add.hgcc -c add.c -o add.o
sub.o:sub.c sub.hgcc -c sub.c -o sub.o
//main的依赖文件就已经写完了,最后添加一个clean方更新后再次编译
clean:rm -f main main.o add.o sub.o

2.3一些规则

按照上面的例子做一个解释

目标文件需要依赖文件
目标文件(没有后缀);-o命令生成目标文件

依赖文件需要源文件
依赖文件(-o文件);-c命令生成-o文件

源文件(.c文件);


三、makefile编写

为了展示,所以我们这里简简单单的写一个例子
我们写一个简单的计算文件
首先写一个main函数
main.c

int main()
{printf("1 + 1 =%d\n",add(1,1));printf("9 - 3 =%d\n",sub(9,3));return 0;
}

在编写一个 add.c函数

#include "test.h"
int add(int i, int j)
{return i + j;
}

再编写一个 sub.c函数

#include "test.h"
int sub(int a, int b)
{return a - b;
}

最后编写一个 test,h的头文件

#include #ifndef _TEST_H #define _TEST_H int add(int i, int j); int sub(int a, int b); #endif

编写一个 makefile文件(不用后缀)

main:main.o add.o sub.ogcc main.o add.o sub.o -o main
main.o:main.c add.c sub.c gcc -c main.c -o main.o
add.o:add.c test.hgcc -c add.c -o add.o
sub.o:sub.c test.hgcc -c sub.c -o sub.o
clean:rm -f main main.o add.o sub.o

在这里插入图片描述


四、makefile其余用法

如果你没有更改过文件,再次make,他会提示你 你编译的执行文件已经是最新的
在这里插入图片描述如果你更改过源文件,他就会重新make一次
在这里插入图片描述这是通过系统自带的时间来判断你更改文件的时间是make之前还是make之后。
同理我们也可以通过这样来判断你的源文件是否被改过。

make clean:

上面的代码可以看出,make clean就是删除所有的依赖文件。这样我们就可以重新编译代码,既方便又快捷。
你也可以把 make clean 看成一个标准格式里面的东西,因为基本上的makefile文件都也有他。


推荐阅读
  • [转]Makefile 使用总结
    2019独角兽企业重金招聘Python工程师标准1.Makefile简介Makefile是和make命令一起配合使用的.很多大型项目的编译都是通过Makefile来组织的,如 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 深入分析 Linux 内核链表转
    引用地址:http:www.ibm.comdeveloperworkscnlinuxkernell-chainindex.html一、链表数据结构简介链表是一种常用的 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • 编写程序可以用vi编辑器vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和 ... [详细]
  • 简书: https:www.jianshu.comp5c3938ce2cf61.官网下载https:nginx.orgendownload.html  2.上传CentOS服务略3 ... [详细]
  • ubuntu下基于c++的opencv学习
    一、环境配置1、安装opencv2、makefile编写makefile模板,与c文件在同一个目录下,用make指令生成可执行文件,然后运 ... [详细]
author-avatar
流浪者时空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有