当前位置: 首页 > news >正文

Makefile的依赖管理

1、示例程序

(1)a.c文件

#include <stdio.h>void func_b(void);
void func_c(void);int main(void)
{func_b();func_c();               
}

(2)b.c文件

#include <stdio.h>void func_b(void)
{printf("This is func_b\n");
}

(3)c.c文件

#include <stdio.h>
#include "c.h"void func_c(void)
{printf("This is c = %d\n", C);
}

(4)c.h文件


#define C 1                         

(5)Makefile文件

test: a.o b.o c.ogcc -o test $^%.o : %.cgcc -c -o $@ $<

2、Makefile存在bug

(1)make编译后,执行./test.exe 打印出:

This is func_b
This is c = 1

(2)然后修改c.h

#define C 2

(3)重新编译运行,结果不变,说明现在的Makefile存在问题。

  • 为什么会出现这个问题呢, 首先test依赖c.o,c.o依赖c.c, 也依赖c.h。
  • 更新了c.h,并没有在Makefile上体现出来,导致c.h的更新,Makefile无法检测到。
  • 因此需要添加:
c.o : c.c c.h

(4)现在每次修改c.h,Makefile都能识别到更新操作,从而更新最后输出文件。每个.c文件编译都要依赖其.h文件,对于内核,有几万个文件,不可能为每个C文件依次写出其头文件。 因此需要做出改进,让其自动生成头文件依赖。

3、依赖相关指令

gcc -M c.c                     // 打印出依赖gcc -M -MF c.d c.c             // 把依赖写入文件c.dgcc -c -o c.o c.c -MD -MF c.d  // 编译c.c, 同事把依赖写入文件c.d

3.1、打印出依赖

3.2、把依赖写入文件

3.3、编译且把依赖写入文件

gcc -c -o c.o c.c -MD -MF c.d
部分含义
gcc调用 GNU C 编译器。
-c只编译,不链接。生成目标文件(.o),不会生成可执行文件。
-o c.o指定输出的目标文件名为 c.o(默认是 c.o,但这里显式指定)。
c.c输入的 C 源文件。
-MD自动生成依赖信息(用于 make),并默认写入 .d 文件(这里是 c.d)。
-MF c.d显式指定依赖文件的输出名为 c.d(覆盖 -MD 的默认行为)。

4、修改Makefile

objs = a.o b.o c.odep_files := $(patsubst %,.%.d, $(objs))   # 把obj里所有文件都变为.%.d格式,并用变量dep_files表示
dep_files := $(wildcard $(dep_files))      # 利用wildcard函数,判断dep_files是否存在test: $(objs)gcc -o test $^ifneq ($(dep_files),)                      # 如果dep_files变量不为空,就将其包含进来
include $(dep_files)
endif%.o : %.cgcc -c -o $@ $< -MD -MF .$@.d	clean:del *.o test.exe                         distclean:del $(dep_files)                  .PHONY: clean distclean

5、编译参数

(1)添加CFLAGS,即编译参数。比如加上编译参数-Werror,把所有的警告当成错误。

CFLAGS = -Werror…………%.o : %.cgcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

(2)除了编译参数-Werror,还可以加上-I参数,指定头文件路径,-Iinclude表示当前的inclue文件夹下。

CFLAGS = -Werror -Iinclude …………%.o : %.cgcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

http://www.dtcms.com/a/571169.html

相关文章:

  • 兰州seo网站排名自动发货网站建设
  • 天津建设网站哪家好社交网络营销是什么
  • SQL子查询完全指南:从零掌握嵌套查询的三种用法与最佳实践
  • 建设网站需要的安全设备汕尾招聘网
  • 网站开发技术及软件介绍河津市城乡建设局网站
  • 厦门启明星网站建设优化神马网站关键词排名价格
  • 湖北城乡建设厅官方网站网站做404
  • 网站建设职业wordpress 调用api
  • 重庆网站建设优斗士电子商务网站的建设和维护
  • excel做网页放进网站wordpress点击下载
  • 泉州建设公司网站的公司WordPress实现微信一键登录
  • 百度权重9的网站做照片用的视频模板下载网站
  • 通过图表和详细流程解释XXL-JOB中任务从创建到执行的完整过程
  • 现在个人做网站还能盈利南通网络推广
  • 网站后台代码四川同风源建设工程有限公司网站
  • 给公司做网站的费用入什么科目合肥建筑材料市场信息价官网
  • wordpress子目录站点邹城建网站
  • 电子商务网站开发设计报告书服务商标有哪些
  • 网站可以建几个人企业网站规划案例
  • 网站申请要多少钱做一个公司网站一般需要多少钱
  • 海南省住房城乡建设厅网站浏览器的网址是多少
  • 网站信息系统建设江都建设局网站李局
  • 怎么打开域名网站游戏推广吧
  • linux文件系统和软硬连接
  • 网络 网站建设万能进销存软件免费版
  • 网站优化的主要内容服装搭配网站建设策划书
  • 深圳网站建设公司大全搜狗关键词排名查询
  • 江西网站建设成品软件十大免费
  • 电子学会青少年软件编程(C/C++)3级等级考试真题试卷(2025年9月)
  • 电子商务网站有哪些?个人app开发平台免费