文章目录

  • 前言
  • 一、make工具简介
    • 1.什么是make?
    • 2.如何安装make?
  • 二、编写Makefile文件
    • 1.文件组成
    • 2.工作原理
    • 3.Makefile文件优点
    • 4.单级目录下的Makefile文件编写
    • 5.多级目录下的Makefile文件编写
  • 总结

前言

   我们刚开始在Linux系统下进行编程时,采用的编译方法为:将程序所引用的文件打包成静态库/共享库,再使用生成的静态库/共享库与源程序一起编译成可执行文件
   然而,我们发现在一个中大型的C/C++工程中,往往包含了成百上千个源文件。如果我们使用上述方法编译,编译命令就会变得十分冗长,在输入命令的过程中容易出错。即便是正确输入了编译命令,在进行编译过程中,也会耗费较长的编译时间。显然,手动编译并不适用于大部分的Linux编程场景。
   为解决以上问题,我们将在本篇中学习如何编写Makefile文件完成自动化编译。


一、make工具简介

   在学习编写Makefile文件之前,我们需要先了解Linux系统中一个非常重要的编译命令make

1.什么是make?

   make是用于自动编译,链接程序的实用工具。它最主要最基本的功能就是通过makefile文件来描述源程序之间的相应关系,并自动维护编译工作。
   使用make工具的好处在于,在编译完成之后,若修改了某个源代码,make只对修改后的部分进行编译,其他目标文件不会更改,并且会安装文件依赖性来更新执行文件。大大提高了编译效率。

2.如何安装make?

  (1)进入root权限,终端命令:sudo su

  (2)进入更新列表,终端命令:apt-get update

  (3)Linux安装make,终端命令:apt-get install ubuntu-make

  (4)验证是否安装成功,终端命令:make -v,显示所安装make的版本号即安装成功。

二、编写Makefile文件

1.文件组成

  • makefile三要素:targets(目标),prequisities(依赖),command(命令)
  • 每个依赖关系由一个目标文件和一组该目标所需的源文件(依赖文件)构成。
  • 命令则描述了如何通过这些依赖关系文件创建目标。

makefile文件格式如下:
             目标文件:依赖文件
             [tab键] gcc -o 目标文件 依赖文件

2.工作原理

  • 目标生成:检查规则中的依赖是否存在,若依赖文件不存在,则寻找是否有规则生成依赖文件。
  • 目标更新:检查目标文件的所有依赖文件,任何一个依赖文件有更新时,就重新生成目标文件。

3.Makefile文件优点

(1)减少重复编译时间

   在改动其中一个文件时,能判断哪些文件被修改过,只对该文件进行重新编译,然后重新链接所有目标文件, 大大提高了编译效率,节省了编译时间。

(2)利于大量代码关系维护

   中大型工程中源代码较多,手工维护编译时间长,且编译命令复杂,把代码维护命令和编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,实现高效编译。

4.单级目录下的Makefile文件编写

(1)第一版本,通俗易懂但不通用

(2)第二版本,变量obj类似C/C++中的宏定义,进行等量替换

(3)第三版本,将依赖文件改成相应的头文件,make命令在编译过程中会自动推导

(4)第四版本,$@目标文件;$^所有依赖文件;$<第一个依赖文件

(5)第五版本,wildcard函数,查找文件下所有文件名;patsubst函数,查找替换

5.多级目录下的Makefile文件编写

   当工程文件比较大时,我们可以采用文件分类的方式,将工程文件分为头文件(include)源文件(src)目标文件(obj)可执行文件(bin),并在这几个文件的同级目录下编写makefile文件,如下图所示。

此时,对应的makefile文件通用写法,如下所示。

DIR_INC = ./include
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./binSRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))TARGET = mainBIN_TARGET = ${DIR_BIN}/${TARGET}CC = gcc
CFLAGS = -g -Wall -I${DIR_INC}${BIN_TARGET}:${OBJ}$(CC) $(OBJ)  -o $@${DIR_OBJ}/%.o:${DIR_SRC}/%.c$(CC) $(CFLAGS) -c  $< -o $@clean:find ${DIR_OBJ} -name *.o -exec rm -rf {} \;

总结

   以上就是关于如何编写Makefile文件的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

【Linux基础】如何编写Makefile文件?相关推荐

  1. 从0开始教你编写Makefile文件

    目录 编写Makefile第一步,了解什么是Makefile? 编写Makefile第二步,明白编译链接过程 编写Makefile第三步,实现简单的Makefile(生成单个可执行文件) 解释一下一个 ...

  2. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.     当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令 ...

  3. VS.net下编写makefile文件--NMAKE用法

    1.程序源文件: 如有三个文件:主文件:hello.cpp,类NUM的说明和实现文件:Num.h和Num.cpp,内容如下: main.cpp: #include "iostream&quo ...

  4. linux 筛选文件,「Linux基础知识」grep文件内容筛选命令的使用

    原标题:「Linux基础知识」grep文件内容筛选命令的使用 grep命令用于从文档中抓取显示包含指定字符的行,grep命令的使用格式如下: grep [选项] 匹配模式 文件1 文件2 ...... ...

  5. 编写Makefile文件

    续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...

  6. Linux基础2路径及文件

    一.路径 1.1绝对路径 在linux系统中是从系统根目录开始向下遍历到指定位置的路径,中途用我的' / '隔开. 例如: myj的桌面的绝对路径:/home/myj/Desktop teacher的 ...

  7. Linux C语言C++ makefile文件编写

    ps: 这里 不是很明白?尤其是 后面 三个变量,什么区别? $@ 代表目标 $^ 代表全部依赖 $< 第一个依赖 $? 第一个变化的依赖 makefile makefile 命名规则makef ...

  8. Linux基础第四课——文件操作

    文件的创建 touch sudo touch 文件1 文件2 文件3 #支持批量创建文件 sudo rm -f 文件1 文件2 文件3 #支持批量创建 也支持批量删除 echo '谁动谁输,对不起我输 ...

  9. 一天一个Linux基础命令之复制文件或目录命令cp

    cp复制文件或目录 1.命令格式 cp[OPTION]... SOURCE... DIRECTORY 2.命令说明 cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,she ...

最新文章

  1. ubuntu nginx php-fpm mysql_Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
  2. 理解浏览器允许的并发请求资源数
  3. Qt 操作words实例 --- 幼儿快算题生成器
  4. reactjs css modules解决组件间样式覆盖问题
  5. 怎么让sublime text3可以运行c/c++
  6. linux下硬盘测速工具hdparm
  7. Mac电脑:Flutter开发环境配置小白教程
  8. 使用Gitbook来编写你的Api文档
  9. iperf3 for Linux
  10. poi实现word转html
  11. pdf图片怎么转换成word文档?
  12. $.ligerDialog弹出对话框
  13. GB28181国标平台接入摄像头、NVR录像机通道数位0没有通道的处理方式
  14. 小学算术运算测试程序java_Java实现小学四则运算练习系统(UI)
  15. 八、CSS基础选择器
  16. python抠图太模糊,讲实话,我会Python之后!我都不屑用PS了!Python抠图太方便了!...
  17. new Date() 获取本月天数、获取本月的最后一天日期
  18. 微信网页开发-长按二维码无法识别问题解决
  19. 神码AI黑科技,人工智能写作的发展空间有目共睹
  20. oracle 数据转换不报错,oracle数据库与hibernate方言转型异常

热门文章

  1. Double,double
  2. asm.js 和 Emscripten 入门教程
  3. MYSQl逻辑运算符(与运算、或运算、非运算、异或运算)
  4. SAP License:SAP的库龄分析表
  5. 观陕西商南县水沟村岩屋洞有感
  6. Keychron 键盘指南
  7. 【新番尝鲜】超越宇宙的少女——不明生物参见
  8. 阿里P8测开晒出2月工资条,看完真的狠狠扎心了…
  9. 阳泉学计算机,阳泉计算机专业多少分可以学?,计算机专业
  10. [Unity-3d] 联网五子棋~~