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

编写一个简单通用的makefile

author:李超

date:2012/05/06

       纵然makefile的规则还是相当多的,编写一个大规模的软件,良好的makefile架构是方便维护程序编译的关键。学习makefile的时间周期还是比较长的,为了写出规范的代码,需要在很短的时间内编写一个makefile,这里给给出一个makefile示例。在组织程序的时候可以按照这个示例给出的结构进行,同时还能提高程序的可读性和合理的目录结构。

       先贴出makefile的代码:

 

 
 
  1. CC = gcc 
  2.  
  3. CXX = g++ 
  4.  
  5.   
  6.  
  7. CLINKER = gcc 
  8.  
  9. CXXLINKER = g++ 
  10.  
  11.   
  12.  
  13. DEFINES += 
  14.  
  15.   
  16.  
  17. CFLAGS += 
  18.  
  19. CXXFLAGS += 
  20.  
  21. LINKFLAGS += 
  22.  
  23.   
  24.  
  25. LINK = $(CXXLINKER) 
  26.  
  27.   
  28.  
  29. INCPATH += 
  30.  
  31.   
  32.  
  33. LIBS +=  
  34.  
  35.   
  36.  
  37. OBJECTS = main.o 
  38.  
  39.   
  40.  
  41. TARGETS = producer_consumer 
  42.  
  43.   
  44.  
  45. DEL = rm -rf 
  46.  
  47.   
  48.  
  49. first:all 
  50.  
  51.   
  52.  
  53. .SUFFIXES: .o .c .cpp .cxx .cc .C 
  54.  
  55.   
  56.  
  57. .c.o: 
  58.  
  59.        $(CC) -c $(INCPATH) $(CXXFLAGS) -o "$@" "$<" 
  60.  
  61. .cpp.o: 
  62.  
  63.        $(CXX) -c $(INCPATH) $(CXXFLAGS) -o "$@" "$<" 
  64.  
  65. .cxx.o: 
  66.  
  67.        $(CXX) -c $(INCPATH) $(CXXFLAGS) -o "$@" "$<" 
  68.  
  69. .cc.o: 
  70.  
  71.        $(CXX) -c $(INCPATH) $(CXXFLAGS) -o "$@" "$<" 
  72.  
  73. .C.o: 
  74.  
  75.        $(CXX) -c $(INCPATH) $(CXXFLAGS) -o "$@" "$<" 
  76.  
  77.   
  78.  
  79. all:$(TARGETS) 
  80.  
  81. $(TARGETS):$(OBJECTS) 
  82.  
  83.        $(LINK) $(LINKFLAGS) -o $(TARGETS) $(OBJECTS) $(LIBS) 
  84.  
  85.        
  86.  
  87. clean: 
  88.  
  89.        $(DEL) $(OBJECTS) 

 

       首先,要说明的是这个makefile对应的是CC++的源程序。对于一个makefile,我们需要定义的关键信息有:

 

l  C编译器

l  C++编译器

 

l  C链接器

l  C++链接器

 

l  C编译标志

l  C++编译标志

 

l  C链接器的标志

l  C++链接器的标志

 

l  编译时指定的宏

 

l  程序中用到的头文件所在的目录

 

l  程序中引用的库函数所在的目录,以及所用到的库

 

l  生成的可执行文件的名称

 

l  生成的可执行文件所需要的目标文件

 

         OK,大致就是这些内容。有了这些信息之后,我们就利用隐形规则编写生成目标文件的命令了。在上面的makefile文件中:

u  变量CC表示C编译器

u  变量CXX表示表示C++编译器

u  变量CLINKER表示C链接器

u  变量CXXLINKER表示C++链接器

u  变量DEFINES表示定义的宏

u  变量CFLAGS表示编译C程序时需要的标志

u  变量CXXFLAGS表示编译C++程序时需要的标志

u  变量LINKFLAGS表示链接时用到的标志

u  变量LINK用来指定最终链接时用到的编译器

u  变量INCPATH用来指定头文件所在的路径(-I

u  变量LIBS用来指定用到的库文件所在的目录以及要链接的库(-L  -l

u  变量OBJECTS用来指定生成可执行文件所需要的目标文件

u  变量TARGET用来指定可执行文件的最终名称

         接下来就要编写makefile的第一个规则---入口规则,在makefile中使用 first:all,就是告诉make首先去all这个label处执行命令。

         然后再看all这个labelall依赖于$(TARGET),所以make程序回去生成 $(TARGET),所以就顺理成章的执行了all下面这条命令:

         $(LINK) $(LINKFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

         由于开始的时候,还没有生成所需要的目标文件(OBJECTS指定的),所以回去执行那些隐式规则以生成目标文件。这些隐式规则是由 .SUFFIX这行以及后续的几行指定的。

         .SUFFIX说明了项目中用到的文件的后缀。然后再接下来几行中,对每个源文件的后缀和目标文件后缀的映射关系安排相应的命令,使之能够生成相应的目标文件,最终生成可执行文件。

         至于clean就不多说了。



本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/854816


相关文章:

  • ORA-00119: invalid specification for system parameter REMOTE_LISTENER
  • bootstrap-水平表单
  • MYSQL数据库字符编码设置
  • 网站测试自动化系统—数据驱动测试
  • LeetCode169. Majority Element C语言
  • CCNP综合实验2
  • *1 计算机基础和操作系统基础及几大协议
  • 没有ARM开发板一样移植uboot并用SKYEYE仿真
  • 如何通过httpclient获取访问域名的真实ip
  • NET客户端js调用服务器端控件的方法
  • 4周第5次课 zip压缩工具 tar打包 打包并压缩
  • Windows Server 2008R2 漫游用户配置
  • 大规模中文概念图谱CN-Probase正式发布
  • Windows XP \Windows 2003启动过程的学习及故障分析处理(五)
  • Ural State University Internal Contest October'2000 Junior Session
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • CSS 三角实现
  • Laravel 中的一个后期静态绑定
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 马上搞懂 GeoJSON
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 深度学习中的信息论知识详解
  • 新手搭建网站的主要流程
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Java数据解析之JSON
  • 从如何停掉 Promise 链说起
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1)(1.11) SiK Radio v2(一)
  • (6)添加vue-cookie
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)docker:Dockerfile构建容器运行jar包
  • .Net CF下精确的计时器
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET关于 跳过SSL中遇到的问题
  • .NET开发者必备的11款免费工具
  • :如何用SQL脚本保存存储过程返回的结果集
  • [Android]一个简单使用Handler做Timer的例子
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C/C++] -- 二叉树
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [Codeforces] probabilities (R1600) Part.1
  • [flask]http请求//获取请求头信息+客户端信息
  • [HackMyVM]靶场Boxing
  • [IM] [Webhook] Webhook实现IM平台机器人
  • [LeetCode] NO. 169 Majority Element
  • [Nginx]反向代理Node将3000端口访问转换成80端口
  • [nlp] 损失缩放(Loss Scaling)loss sacle