首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

相关知识:MakeFile

在Linux下,工程比较大的时候,编译之类的操作就比较麻烦了,此时用GNU make工具可以做到自动化编译,而make默认就会找MakeFile或者makefile文件然后执行一些操作,当然也可以指定文件。

由于Python源码在也可以在Linux下编译,所以就顺便学习Linux

学习makefile的知识主要在GNU官网,虽然是英文的文档,但是阅读不会很困难

GNU make

makefile的主要作用

makefile主要是为了应对当一部分文件改变的时候另一部分文件需要改变的情况,当然比较常见的是用于编程,针对一个大的工程而使用。

这里以C语言为例,对一个稍微大点的工程,我们会有多个 .c文件,也有自己写的 .h头文件,编译时需要先编译每个 .c文件,然后 .c编译后生成 .o或者是 .obj文件,最终链接成为可执行文件。每次都要自己去做这些是很麻烦的事,但是如果有makefile,就可以通过执行make文件,很方便的编译,而且如果需要添加文件,也只需要对makefile做一点改动就可以。

makefile应用举例

因为之前看着编译原理的时候写过一个中缀转后缀表达式的一个小东西,当时是我第一次接触makefile,用的是windows下的minGW,所以我拿这个举例子(就不拿官网的了)

有8个文件,如果想直接拿这个试,私信我可以给源码(这个简单到我有点不好意思拿出手)

main.cpp入口

headers/global.h唯一的头文件

symbol/init.cpp用关键字初始化符号表

symbol/symtable.cpp符号表

parse/lexer.cpp词法分析器

parse/parser.cpp词法分析(消除左递归)

other/emitter.cpp输出模块

other/error.cpp错误处理模块

makefile中的文件是

makefile

而调用的时候在命令行使用make就可以,效果是这样的:

效果图

解释makefile文件

首先解释最基本的结构

生成init.o

目标是生成init.o,具体流程就是当symbol文件夹中的init.cpp或者headers文件夹中的global.h两个文件发生改变的时候,要执行g++ -c -w symbol/init.cpp命令,生成的文件命名为最开始写的init.o

其它几句都类似

但是第一个这样的结构是最重要的,因为会从它开始解析,这里就是先从compiler解析

而且由于make可以自动推断,我们还可以简写,比如

生成main.o

可以写为main.o: headers/global.h

它会自己推断用g++编译,但是如果需要更多的参数的时候,比如我这里的写了-w,就要自己再写了,因为它只会推断出g++ -c main.cpp

如上面的init.o去掉就不能推断,因为init.cpp和它不在同一目录下

除此之外,还有变量的使用

变量的使用

这里OBJS就是变量,引用的时候使用$(OBJS)就可以了,由于OBJS里面的那些文件既是compiler更新的条件,又是命令的一部分,所以为了方便起见,使用OBJS变量,而我之后要添加文件的话,也只需要在OBJS后添加即可,也不需要担心哪里忘了写

一般情况都会有类似OBJS的变量:objects, OBJECTS, objs, OBJS, obj或者OBJ;放置所有的object文件

而且,当文件过多的时候,一行显得不够,这时候需要使用反斜杠(\)来将其分开:

使用\

当然,不只是这里,其它地方也可以写,但是\后不能加空格

最后,就是clean的使用

clean和其它结构有所不同的是后面条件部分什么都没有,所以就是没有什么会引起它变化,所以正常编译的时候不会执行到clean,想要执行它,需要明确指出,即在命令行中运行make clean,一般会写clean命令来删除生成的 .o文件

由于可能会出现命名为clean的文件,它可能会由于之前提到的推断的规则而被误解,就像main.o写成这样不会出错

所以为了避免这种情况,一般会将clean写为

clean写法

说明clean就是一个要显示指出的命令,通过make clean来执行

由于篇幅不长,不够全面,基本的够用了,之后根据情况看是否需要继续深入

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190818A0598800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券