博客
关于我
Makefile的静态模式%.o : %.c
阅读量:163 次
发布时间:2019-02-28

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

Makefile的静态模式是一个特别高效的“自动化”编译器,“静态”二字,可能是我对词意的直译,但我觉得和中文的“静态”几乎没有半毛钱的关系。其实,这个规则和“静态”这个词在中文里没有直接关联。

我们在编写应用程序时,通常会有多个源文件,如.c和.s文件,可能只有几十个,也可能有几千或几万个。在Windows环境下,我们可以使用各种IDE,一键编译,但在Linux环境下,就得自己写Makefile来实现类似的功能。写Makefile的人通常都是技术高手,因为他们对各种编译工具和细节都有深入的了解。

一个执行程序的生成通常需要两个步骤:编译和链接。编译的原理是将.c和.s文件转换为.o文件(目标文件),然后链接器将这些目标文件链接成一个可执行文件。这两个步骤的命令分别是:

编译:gcc -c xxx.c/xxx.s链接:gcc *.o -o xxx

在编写Makefile时,通常的框架如下:

main : func1.o func2.o func3.o funcx.o    gcc $^ -o $@
func1.o : func1.c    gcc -c func1.c
func2.o : func2.c    gcc -c func2.c
...

在这个框架中,main是最终目标,而func1.o、func2.o等文件既是main的依赖对象,又是一个小目标,需要进行编译生成。然而,如果我们有几百个、几千个甚至几万个源文件,这样的手动编写显然是不现实的。

显然,这样的方式也不可能在大规模项目中使用,Unix/Linux环境也不允许我们这么做。因此,我们需要一种更灵活的方法来处理大量的源文件。这时候,Makefile的静态模式和自动化变量就派上用场了。

静态模式是一种自动化编译模式,它允许我们定义“多目标”规则,使编译规则更加灵活和可扩展。其语法如下:

targets : target-pattern : prereq-pattern ...commands
  • targets 定义了一组目标文件,可以使用通配符。
  • target-pattern 是目标文件的模式,例如.o。
  • prereq-patterns 是目标文件的依赖项,例如.c。

例如,我们可以定义如下规则:

$(OBJS) : %.o : %.c    gcc -c $< -o $@

其中,$(OBJS) 是所有目标文件的集合,%.o 是目标文件的模式,%.c 是对应的源文件模式。$< 表示依赖对象,$@ 表示目标文件。

这样,我们就可以用一个简单的规则来处理所有的源文件。实际使用时,我们可以直接写成:

%.o : %.c    gcc -c $< -o $@

这条规则的功能是遍历所有的.c文件,对每个文件进行编译,生成对应的.o文件。这种方法可以轻松处理从几十个到几万个源文件的情况。

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

你可能感兴趣的文章
python3爬虫抓取智联招聘职位信息代码
查看>>
Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
查看>>
python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
查看>>
Python3笔记——IDE的选择
查看>>
python3简单使用requests 用户代理,cookie池
查看>>
Python3组播通信编程实现教程(发送者+接收者)
查看>>
Python3编写网络爬虫10-数据存储方式三-CSV文件存储
查看>>
python3读取redis返回数据带有'b'的问题
查看>>
Python3连接MySQL
查看>>
Python关于isinstance函数的解析 | 附Demo(全)
查看>>
Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
查看>>
python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
查看>>
python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
查看>>
Python: AES加密与解密
查看>>
Python: Range() 最大尺寸;动态的还是静态的?
查看>>
Python: Windows下用 multiprocessing 的深坑
查看>>
python:Could not find platform independent libraries <prefix>解决方法
查看>>
Python:datetime tzinfo 时区名称文档
查看>>
Python:deepcopy(list) vs new_list = old_list[:]
查看>>
Python:Google API - 从消息中获取 mimeTypes
查看>>