原文地址:简单通用的Makefile(转)作者:黑暗幽灵

本人是一个刚接触嵌入式的菜鸟,因为最近写完程序老要编译,总是要写Makefile,

所以找了一个通用的Makefile,

作者:杨硕,华清远见嵌入式学院讲师。

下面这个Makefile就可以满足这个要求:

  SRCS = $(wildcard *.c)

  OBJS = $(SRCS:.c = .o)

  CC = gcc

  INCLUDES = -I/home/noah/build_sqlite3/include

  LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3

  CCFLAGS = -g -Wall -O0

  my_app : $(OBJS)

  $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

  %.o : %.c

  $(CC) -c $< $(CCFLAGS)

  clean:

  rm *.o

  大家看这个Makefile和前一个比起来是不是简洁很多,当然理解起来不如上一个那么直观。实际上编写Makefile就是为了提高我们的工作效率,而不是增加我们的工作量。因此Makefile为我们提供了很多强大的功能,比如定义变量,使用通配符等等。只要合理利用,就可以达到事半功倍的效果。

  下面我们一条一条分析这个Makefile:

  SRCS = $(wildcard *.c)

  这条语句定义了一个变量SRCS,它的值就是当前面目录下面所有的以.c结尾的源文件。

  OBJS = $(SRCS:.c = .o)

  这里变量OBJS的值就是将SRCS里面所有.c文件编译出的.o目标文件

  CC = gcc

  变量CC代表我们要使用的编译器

  INCLUDES = -I/home/noah/build_sqlite3/include

  LIBS = -L/home/noah/build_sqlite3/lib -lsqlite3

  这里指定除了编译器默认的头文件和库文件的路径之外需要额外引用的头文件路径以及库的路径。

  CCFLAGS = -g -Wall -O0

  CCFLAGS变量存放的是编译选项

  my_app : $(OBJS)

  $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

  my_app依赖于所有的.o文件,$^代表$(OBJS),$@代表my_app

  %.o : %.c

  $(CC) -c $< $(CCFLAGS)

  将所有的.c源代码编译成.o目标文件,这样写是不是很省事?

  clean:

  rm *.o

  在执行make clean之后删除所有编译过程中生成的.o文件。

  这个Makefile就具备灵活的通用性,我们只要对它稍作修改就可以用在自己的工程里面。当然Makefile还有很多强大的功能,需要我们进一步学习。

补充1:=   :=   ?=    +=

makefile 中 =   :=   ?=    +=的意义:

= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

补充2:.PHONY

install:foo
         install   -m  644 foo  /usr/bin
.PHONY: install
 看以上makefile的片段,使用了.PHONY这个目标,下面详细介绍她的用法.
来源:点击打开链接
.PHONY是一个特殊工作目标(special target)
    它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)
  PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,但是当面对一些大工程的时候,.PHONY则显得相当有用),改善性能。

转载于:https://my.oschina.net/u/1024573/blog/408501

简单通用的Makefile相关推荐

  1. FFmpeg源代码简单分析:makefile

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:huanzi-qch cnblogs.com/huanzi- ...

  3. Linux下通用的Makefile

    Linux下通用的Makefile 我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c/.cpp的源文件.如果我们用gcc/g++去一个一个编译 ...

  4. ajaxfileupload 访问不到后台_一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)...

    前言 这套Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理.菜单管理.用户管理,系统设置.实时日志,实时监控,API加密,以及登录用户修改密码.配置个性菜单等 技术栈 前端:la ...

  5. 一个通用的makefile写法,自动推导文件的依赖关系

    温习之用. 假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录 写一个完整的makefile步骤如下: 1 定义可执行文件的名称 TARGET ...

  6. 生成交叉表的简单通用存储过程

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id ...

  7. c# 基于layui的通用后台管理系统_简单通用的Java后台管理系统

    前言 这套Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理.菜单管理.用户管理,系统设置.实时日志,实时监控,API加密,以及登录用户修改密码.配置个性菜单等 技术栈 前端:la ...

  8. 一个通用中间组件,简单通用的适配 ViewPager,以及 pager 中的 RecycleView 简化复杂的操作,简单直接。

    EasyTabPager 项目地址:ccj659/EasyTabPager  简介:一个通用中间组件,简单通用的适配 ViewPager,以及 pager 中的 RecycleView 简化复杂的操作 ...

  9. 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目源码)

    前言 这套Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理.菜单管理.用户管理,系统设置.实时日志,实时监控,API加密,以及登录用户修改密码.配置个性菜单等 技术栈 前端:la ...

  10. linux .pc文件make,简单的驱动makefile详解

    简单的驱动makefile详解 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编 ...

最新文章

  1. 2022-2028年中国锂电材料产业投资分析及前景预测报告
  2. Item 9 Always override hashCode when you override equals HASHMAP扩展
  3. Java 答疑:JDK 11(Java 11)之后没有 JRE 目录,环境用户变量配置的解决方法
  4. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件
  5. opencv多目标追踪容器
  6. MQ学习(一)----JMS规范(转发整合)
  7. ntag213和215有什么区别_NTAG213、NTAG215和NTAG216NFC标签
  8. 消极风险应对策略的区别
  9. 计算机毕业设计Node.js+uniapp安卓在线民宿预定app(源码+程序+lw+远程调试)
  10. eGPU 能否一战?- Tensorflow GPU 基准测试
  11. 打开ajax大门的新世界(我真的很喜欢这篇内容!)
  12. FFMPEG 实现视频拼接,中间插入图片实现过渡
  13. SOM网络算法分析与应用(适合入门、快速上手)
  14. 祝福视频生成器(一图一文AI生成)
  15. 一些选好虚拟主机控制面板的秘诀
  16. 仿百度网盘html页面源码,仿百度云主界面
  17. 计算机毕业设计SSM宾馆管理信息系统【附源码数据库】
  18. Java的Closeable接口close()方法的意义
  19. 李开复:AI 创业的十个真相 | 深度
  20. 通用人工智能:涌现能力、代理执行、功能可见、具身应用——人与机器的共同进化

热门文章

  1. 【模型加速】PointPillars模型TensorRT加速实验(4)
  2. 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
  3. ZA303学习笔记十部署负载均衡器和网络安全
  4. pandas学习笔记(一):数据读入读出基本操作
  5. RPA手把手—— RPA 数据库篇 6 - MySQL 篇 2 - 增删改查 1
  6. 解决win7连接不了win10远程桌面
  7. 装修首页自定义全屏视频播放效果gif动态图片制作视频教程播放代码操作设置全屏居中阿里巴巴国际站
  8. Instrument初识
  9. 论文写作之BIB文件编写
  10. 【踩坑系列】SpringBoot 项目更换浏览器选项卡的图标