• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 一个简单的Makefile编译框架

一个简单的Makefile编译框架

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了makefile编译,makefile 编译选项,makefile编译规则,makefile怎么编译,makefile如何编译等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一个简单的Makefile编译框架


最近在做一个项目时对makefile有了一个简单的认识,于是自己写了一个简单的编译框架,留待后用。下边是一个demo示例,附上所有的源文件,移植工程时搬过来应该就可以用了。

一、demo的文件目录树

  1. ├── app
  2. │ ├── api
  3. │ │ ├── api.c
  4. │ │ └── Makefile
  5. │ ├── include
  6. │ │ └── app.h
  7. │ ├── Makefile
  8. │ └── src
  9. │ ├── app.c
  10. │ └── Makefile
  11. ├── main
  12. │ ├── include
  13. │ │ └── main.h
  14. │ ├── Makefile
  15. │ └── src
  16. │ ├── main.c
  17. │ └── Makefile
  18. ├── Makefile
  19. ├── make.rules
  20. │ ├── config.in
  21. │ ├── make.obj
  22. │ ├── make.src
  23. │ └── rules.mk
  24. └── sdk
  25. ├── Makefile
  26. ├── sdk1
  27. │ ├── include
  28. │ │ └── sdk1.h
  29. │ ├── Makefile
  30. │ └── src
  31. │ ├── Makefile
  32. │ ├── sdk1_1.cpp
  33. │ └── sdk1_2.c
  34. └── sdk2
  35. ├── Makefile
  36. ├── sdk2_1
  37. │ ├── include
  38. │ │ └── sdk2_1.h
  39. │ ├── Makefile
  40. │ └── src
  41. │ ├── Makefile
  42. │ └── sdk2_1.c
  43. └── sdk2_2
  44. ├── include
  45. │ └── sdk2_2.h
  46. ├── Makefile
  47. └── src
  48. ├── Makefile
  49. └── sdk2_2.c

二、使用说明

1.编译帮助,在主目录中输入make help,可以得到编译的帮助信息。

2.user_debug目标是留给用户打印变量使用的。只要在该目标下调用$(call PRINT,变量),就能在执行makefile时打印出指定的变量的值。编译时需要指明打印等级,0-打印所有变量,1-打印内部变量,2-打印用户定义的变量。只打印用户变量使用make all DEBUG_LEVEL=2。

3.user_clean目标是留给用户做清理工作的,在make clean之前会调用到。

4.user目标是留给用户编译时使用的。比如可以在编译完成之后自动清理掉生成的不需要的.o文件,可以直接在user后边加上一个依赖clean。

5.主目录中编译整个工程直接使用make all,只清理.o和可执行文件使用make clean,清理掉所有生成的文件使用make distclean。也可以指定单个目录进行编译,比如make –C app就会只编译app目录,make –C app clean就会单独清理掉app目录。

6.非主目录编译需要先在主目录中成功make all一次,只有生成了配置文件rules.conf才能找到编译时需要依赖的规则文件。所以要在非主目录中编译,不能使用make distclean命令。在非主目录中编译直接使用make 就可以了,清理使用make clean,打印变量使用make DEBUG_LEVEL=2。

三、编译框架说明

1. 整个编译过程用到了三种makefile文件。

(1)第一种是将各个子目录中的.o文件链接成一个.o目标文件。如下,./sdk/Makefile文件。

  1. # 需要编译的子目录
  2. obj-y = sdk1
  3. obj-y += sdk2

  4. # 编译所需参数
  5. # EXTRA_LDFLAGS:链接时需要的参数
  6. EXTRA_LDFLAGS =

  7. # 加载make.obj文件
  8. ifdef MAKE_RULES
  9. include $(MAKE_RULES)/make.obj
  10. else
  11. include ./rules.conf
  12. ifdef MAKE_RULES
  13. include $(MAKE_RULES)/make.obj
  14. endif
  15. endif

  16. # 用户编译配置处
  17. # clean: 清除掉源文件生成的目标文件
  18. # distclean: 清除当前和子目录所有的目标文件
  19. # 编译时在这里可以做其它事情
  20. user:

  21. # 用户清理
  22. user_clean:

  23. # 打印变量
  24. # $(call PRINT,变量):调用该函数可以打印编译时变量的值,该函数定义在rules.mk文件中
  25. # DEBUG_LEVEL = 2时,才会有打印
  26. user_debug:
  27. $(call PRINT,MAKE_OBJ)

这个makefile几乎不用修改任何地方,除了必须指定需要编译的子目录obj-y。其中的所有链接工作是在./make.rules/make.obj文件中完成的。

(2)第二种是将子目录中的源文件编译成.o文件,然后将所有.o文件连接成一个目标.o文件。如下,./sdk/sdk1/Makefile文件。

  1. # 目标文件夹
  2. src-y = src

  3. # 目标文件类型
  4. source_type = .cpp .c

  5. # 编译所需参数
  6. # EXTRA_CFLAGS:c编译参数
  7. # EXTRA_CXXFLAGS:cpp编译参数
  8. # EXTRA_LDFLAGS:链接成目标.o时的参数
  9. EXTRA_CFLAGS += -I$(CURR_DIR)/include
  10. EXTRA_CXXFLAGS += -I$(CURR_DIR)/include
  11. EXTRA_LDFLAGS =

  12. # 加载make.src文件
  13. ifdef MAKE_RULES
  14. include $(MAKE_RULES)/make.src
  15. else
  16. include ./rules.conf
  17. ifdef MAKE_RULES
  18. include $(MAKE_RULES)/make.src
  19. endif
  20. endif

  21. # 用户编译配置处
  22. # clean: 清除掉源文件生成的目标文件
  23. # distclean: 清除当前和子目录所有的目标文件
  24. user:

  25. # 用户清理
  26. user_clean:

  27. # 打印变量
  28. # $(call PRINT,变量):调用该函数可以打印编译时变量的值,该函数定义在rules.mk文件中
  29. # DEBUG_LEVEL = 2时,才会有打印

  30. user_debug:
  31. $(call PRINT,CURR_DIR)

这个文件需要指定源文件目录src-y和需要编译的源文件类型source_type,还有编译的头文件目录。其主要编译规则在./make.rules/make.src中。


(3)第三种makefile是在源文件中,主要是用来进行清理工作的,比如./sdk/sdk1/src/Makefile,如下

  1. clean:
  2. rm -rf *.[od]

  3. distclean: clean

  4. .PHONY: clean distclean


2. 关于./make.rules目录中的规则或配置文件。

config.in:提供编译时需要的全局变量,比如make.rules的位置,环境变量,编译工具链,一些通用的编译参数。

rules.mk: 提供具体的编译规则,打印函数,打印等级,打印颜色。

make.obj: 将多个.o文件连接成一个.o文件。

make.src: 将源文件编译成.o文件,并链接成一个.o文件。


四、一些实现细节

1. 打印函数

  1. PRINT = @echo -e "$(BABYBLUECOLOR)$(1): $($(1)) $(ENDCOLOR)\n";
  2. $(call PRINT,变量)

使用call会将PRINT视为一个函数调用,而后边的变量则视为函数的

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 一个简单的Makefile编译框架

相关文章

  • 2017-05-26Android Fragment 剖析,androidfragment
  • 2017-05-26【同行说技术】Android程序员从小白到大神必读资料汇总(三),android资料汇总
  • 2017-05-26【1】Android 学习笔记 【第一个安卓程序】,android安卓
  • 2017-05-26FlatBuffers初探,flatbuffers
  • 2017-05-26记一次流量异常处理
  • 2017-05-26Android环境的搭建,Android环境搭建
  • 2017-05-26Android EditText只有下面有一条横线问题
  • 2017-05-26安卓第十四天笔记-内容提供者(ContentProvider),contentprovider
  • 2017-05-26WebView,androidwebview
  • 2017-05-26我的android学习经历,android学习经历

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 【lushengduan】01、搭建安卓App开发环境 编写程序HelloWorld,lushengduan安卓
    • 6.2 数据存储与访问之——SharedPreferences保存用户偏好参数
    • ConfigParser写配置文件乱序问题
    • Android代码优化小技巧,android代码小技巧
    • 使用 Diagwait 作为诊断工具,获取用于诊断 Oracle Clusterware 节点驱逐
    • 我的第一篇博客,我试试怎么用,第一篇博客,试试
    • Android中使用SDcard进行文件的读取,androidsdcard
    • android6.0 adbd深入分析(二)adb驱动数据的处理、写数据到adb驱动节点
    • My First Android Application Project 第一个安卓应用,android安卓
    • andriod 读取通讯录,andriod通讯录

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有