3914|4

112

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

一步一步写makefile [复制链接]

  makefile的重要性不用我多说了,翻一翻各种招聘软件上的职位描述就可以发现,如果你会编写makefile来编译大型项目,那么绝对是一个加分项。

 

      今天我们来一步一步从一个low到爆的makefile简化成一个花里胡哨(fei chang jian dan)的makefile。


        首先打开linux环境,我们新建几个文件


 
  • touch main.c tool1.c tool2.c tool1.h tool2.h

        我们的目标就是把这几个文件编译成一个可执行程序test,首先先给里面写个简单的打印函数。

        tool1.c


 
  • #include <stdio.h>
  • #include "tool1.h"
  •  
  • void mytool1(void)
  • {
  • printf("my tool 1 print\n");
  • }

 

        同理,tool2.c我们打印 “my tool 2 print\n”,然后我们在main函数里调用mytool1和mytool2。


 
  • #include "tool1.h"
  • #include "tool2.h"
  •  
  • int main(int argc,char *argv[])
  • {
  • mytool1();
  • mytool2();
  • return 1;
  • }

 

 

     这样的编译依赖就形成了一个树结构,main.o依赖于tool1.o、tool2.o,这个简单的依赖关系再加深多层就能够构建一个复杂的大型项目。

        接下来我们来编写makefile编译这个工程。


 

直捣黄龙-确定目标

       我们的目标是生成一个可执行文件test,这个test的生成依赖于tool1.o tool2.o main.o

       按照makefile的语法开始编写。

       target:依赖文件.o


 
  • test:tool1.o tool2.o main.o

   


    

 各个击破-编译各个c文件

 

       确定好依赖文件后,我们就要开始编译单个的c文件了。


 
  •  
  • main.o:main.c
  • gcc -c -g -Wall main.c -o main.o
  • tool1.o:tool1.c
  • gcc -c -g -Wall tool1.c -o tool1.o
  • tool2.o:tool2.c
  • gcc -c -g -Wall tool2.c -o tool2.o
 
       这部分已经开始让人厌烦了,我们现在还只有3个文件,要是大型项目几百上千个文件的话岂不是要把手写断了,惹不起惹不起...我还是想点办法,简化一下。

       makefile是包含了自动推导特性的,也就是说,如果我们有一个a.o的目标,makefile是会默认为这个目标文件的源文件名也是a,所以上面的代码的依赖关系可以简化为下面这样。

 


 
  • %.o:%.c  gcc -c -g -Wall $^ -o $@

 

        这下清爽多了,妈妈再也不用担心文件太多啦。解释一下上述代码中的$^表示上一行中的依赖源文件,$@表示上一行中的目标文件。

         到这里其实编译就已经结束了,已经生成了我们需要的可执行文件。


 

打扫战场-删除中间文件

 

        删除中间文件就比较简单了,一行代码搞定,这里我们一般只删除中间文件.o 和最终的目标文件test


 
  • rm *.o test -rf



此内容由EEWORLD论坛网友lyncxy119原创,如需转载或用于商业用途需征得作者同意并注明出处

最新回复

内容很干货,受益匪浅,感谢分享,收藏下来慢慢看,加油!!!  详情 回复 发表于 2024-3-11 21:22
点赞(1) 关注

回复
举报

980

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

 
个人签名

没有特别的幸运,就要特别的努力

 

回复

295

帖子

1

TA的资源

版主

板凳
 

内容很干货,排版在注意一下就很好了

 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 
比一上来介绍一堆宏好
 
 
 

回复

419

帖子

0

TA的资源

纯净的硅(中级)

5
 
内容很干货,受益匪浅,感谢分享,收藏下来慢慢看,加油!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表