博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile文件编写
阅读量:4222 次
发布时间:2019-05-26

本文共 2389 字,大约阅读时间需要 7 分钟。

Linux下运行单个.c源文件,可以直接使用以下命令编译运行;

命令1:gcc hello.c -o hello
解释:依赖hello.c文件,调用gcc工具,选项-o的意思是编译连接然后生成后面的那个名字(hello)的文件。(有待补充gcc相关内容)

命令2:./hello

解释:运行hello.o文件

测试用例(hello.c):

#include
#include
int main(int argc,char **argv){ printf("Hello,Linux.\n"); exit(0);}

若依赖多个.c,.h文件时,则需要编写Makefile文件;以下是本文重点,关于makefile的相关介绍。

1、Makefile的规则

  目标 : 需要的条件 (注意冒号两边有空格)

    命令  (注意前面用tab键开头)

  解释一下:

  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。

  2 需要的条件就是生成目标所需要的文件或目标

  3 命令就是生成目标所需要执行的脚本

  

objects = main.o kbd.o command.o display.o /              insert.o search.o files.o utils.o    edit : $(objects)            cc -o edit $(objects)    $(objects) : defs.h    kbd.o command.o files.o : command.h    display.o insert.o search.o files.o : buffer.h    clean :            rm edit $(objects)

注意,在Makefile中的命令,必须要以[Tab]键开始。

总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。

参考链接:

2、Makefile包含内容

Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。

3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。

5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“/#”。

3、引用其它的Makefile

include的语法是:include

filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)

在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:

include foo.make *.mk $(bar)

另外,如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”。如:

-include 

4、make的工作方式

GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

1、读入所有的Makefile。

2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。

5、在规则中使用通配符

如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三各通配符:“*”,“?”和“[…]”。这是和Unix的B-Shell是相同的。

波浪号(“~”)字符在文件名中也有比较特殊的用途。如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。

通配符代替了你一系列的文件,如“.c”表示所以后缀为c的文件。一个需要我们注意的是,如果我们的文件名中有通配符,如:“”,那么可以用转义字符“/”,如“/”来表示真实的“”字符,而不是任意长度的字符串。

特例:objects = *.o

上面这个例子,表示了,通符同样可以用在变量中。但并不是说[.o]会展开!objects的值就是“.o”。如果你要让objects的值是所有[.o]的文件名的集合,可以:

objects := $(wildcard *.o)

参考 链接:

转载地址:http://xymmi.baihongyu.com/

你可能感兴趣的文章
51单片机:设计有四位数码管,设计3个按键,k1,k2,k3;k1为模式键,第一次按下,显示初始值,k2,k3有效,k2按一次初值加1,k3按一次初值减1;k1第二次按下停止;k1第三次按下清零;
查看>>
安卓:阿里逆地理编码,可直接拿去用
查看>>
thinkphp源码没问题却各种报错,Namespace declaration statement has to be the very first statement in the script
查看>>
android:dkplayer中ijkplayer延迟长的问题,达到秒开的结果
查看>>
安卓:okhttp请求,获取返回数据
查看>>
安卓:股票筛选及分析系统
查看>>
Effective Java 学习笔记一 Object的方法
查看>>
使用 ctypes 进行 Python 和 C 的混合编程
查看>>
用scikit-learn学习DBSCAN聚类
查看>>
机器学习:Python实现聚类算法(三)之总结
查看>>
使用sklearn做单机特征工程
查看>>
Python 多线程技巧 用threading.Event代替time.sleep()
查看>>
工具】Cmake与gcc的关系
查看>>
struct中长度为0的数组用途与原理
查看>>
svm笔记
查看>>
C++ 继承&多态
查看>>
C++多继承的观察和7点体会(都是实用派的观点) good
查看>>
python socket编程详细介绍
查看>>
高人对libsvm的经典总结(全面至极)
查看>>
Linux下c语言多线程编程
查看>>