makefile教程(基础) part1

元胞珊瑚
• 阅读 2515

1.1 Makefile的规则

    target... : prerequisites ...
          command
          ...
          ...

解释:
Target : 是一个目标文件,也可以是执行文件,还可以是一个标签(Label)。
Prerequisites :要生成那个target所需要的文件或是目标。
Command : make需要执行的命令。(任意的Shell命令)

1.2 一个示例

main : main.o run.o speak.o eat.o sleep.o
    gcc  -o main main.o run.o \
            speak.o eat.o sleep.o
main.o: main.c
    gcc  -c main.c
run.o : run.c run.h
    gcc  -c run.c run.h
sleep.o : sleep.h sleep.c
    gcc  -c sleep.h sleep.c
eat.o : eat.h eat.c
    gcc  -c eat.c eat.h
speak.o : speak.h speak.c
    gcc  -c speak.h speak.c
clean : 
    -rm main.o run.o \
        speak.o eat.o sleep.o main

反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。
一、在定义依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
二、make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。
三、clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

1.3 makefile中使用变量

对于.o文件多次被使用,在makefile中以“$(objects)”的方式来使用这些变量

OBJECTS= main.o run.o \
           speak.o eat.o sleep.o
main : $(OBJECTS)
    gcc $(CFLAGS) -o main $(OBJECTS)
main.o: main.c
    gcc $(CFLAGS) -c main.c
run.o : run.h run.c
    gcc $(CFLAGS) -c run.h run.c 
sleep.o : sleep.h sleep.c
    gcc $(CFLAGS) -c sleep.h sleep.c
eat.o : eat.h eat.c 
    gcc $(CFLAGS) -c  eat.h eat.c
speak.o : speak.h speak.c
    gcc $(CFLAGS) -c speak.h speak.c
clean : 
    -rm $(OBJECTS) main

1.4 让make自动推导

GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。

CFLAGS = -Wall
OBJECTS= main.o run.o \
         speak.o eat.o sleep.o
main : $(OBJECTS)
    gcc $(CFLAGS) -o main $(OBJECTS)
eat.o main.o : eat.h
run.o main.o : run.h
speak.o main.o : speak.h
sleep.o main.o : sleep.h
.Phony : clean
clean : 
    -rm $(OBJECTS) main

1.5 清空目标文件的规则

  .PHONY : clean
       clean :
               -rm edit $(objects)

为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
4年前
Flutter接入现有iOS工程(混编)、开发调试、打包发布精简教程
本教程是在xcode11.1、cocospod1.7.5、flutter1.10.15pre.115下完成的。    1.安装flutter    按照官网的教程,一步一步来,没什么好说的。https://flutterchina.club/setupmacos/(https://ww
Wesley13 Wesley13
4年前
Makefile讲义(9)——隐含规则
隐含规则————在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C的源程序为中间目标文件(Unix下是\.o\文件,Windows下是\.obj\文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规则”也就是一种惯
Stella981 Stella981
4年前
Pre
PAT甲级1119,我先在CSDN上面发布的这篇文章:https://blog.csdn.net/weixin\_44385565/article/details/89737224(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fweixin_443855
Wesley13 Wesley13
4年前
Unity 获取场景中所有目标对象(包括不激活的对象)
usingUnityEngine;usingUnityEditor;usingSystem.Collections.Generic;publicclassExampleScript:MonoBehaviour{//获取场景中所有目标对象(包括不激活的对象)不包括Pre
Stella981 Stella981
4年前
Jupyter notebook使用技巧大全
点击上方“蓝字”,轻松关注!(https://oscimg.oschina.net/oscnet/3a406a00d29b44568aebb8be9d319d3b.gif)JupyterNotebook简介JupyterNotebook是一款开源的web应用,它允许使用者创建和分享包含代码,公式,可
小万哥 小万哥
1年前
Makefile 基础教程:从零开始学习
在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动构建程序,管理程序依赖关系,提高开发效率。本篇博客将从基础开始,介绍Makefile的相关知识,帮助大家快速掌握Makefile的使用方法Makefile是什么Makefile是一个
小万哥 小万哥
2年前
Makefile常用命令详解
在软件开发中,Makefile是一种非常常用的自动化工具。Makefile文件包含了一系列规则,用于编译、打包、测试等操作,可以帮助我们自动化这些操作,提高项目的管理和编译效率。本文将介绍Makefile中常用的命令,以及如何使用它们来编译和管理项目mak
小万哥 小万哥
2年前
5个编写高效Makefile文件的最佳实践
在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量确定目标在编
小万哥 小万哥
2年前
C/C++项目构建指南:如何使用Makefile提高开发效率
Makefile是一个常用的自动化构建工具,它可以为开发人员提供方便的项目构建方式。在C/C项目中,Makefile可以用来编译、链接和生成可执行文件。使用Makefile的好处是可以自动执行一系列命令,从而减少手动操作的复杂性和出错的可能性。此外,M