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

C学习笔记-makefile

除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,makefile由此而生,在编译时候直接输入make便会按照makefile里面的规则编译源代码。Android的源代码就是通过makefile管理的。

make的工作原理

make通过makefile得到编译规则,从而编译源文件

makefile是以一个文本形式的脚本告诉make编译器如何以及怎么编译源代码,里面包含了编译规则

makefile规则遵循以下通用格式

target:dependency [dependency[···]]
    command
    command
    [···]

每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止

makefile的使用

  • makefile的简单使用
    makefile的文件名必须为makefile或者Makefile
    如果要用其他名称,使用make -f filename
    编写makefile文件如下所示,便可以通过make命令编译test.c文件了
start:
    gcc -o test test.c
  • 进一步使用makefile
start:test.o
    gcc -o test test.o
test.o:
    gcc -o test.o -c test.c

说明:target start后面的test.o代表其下的command依赖与test.o这个target。所以make先执行了test.o这个target下的command,如果存在test.o,那么makefile会去查看.c文件的修改时间,再决定编不编译.c文件

  • makefile完善
start:test.o
    gcc -o test test.o
test.o:
    gcc -o test.o -c test.c
clean:
    rm -f test.o

说明:增加clean标签,其后面的指令会在输入make clean时候执行

  • 在makefile中执行shell命令
start:test.o
    gcc -o test test.o
    @echo '----------ok----------'
test.o:
    gcc -o test.o -c test.c
clean:
    rm -f test.o
  • 简化makefile
    为了简化编辑和维护makefile,可以在makefile中使用变量
varname=some_text

把变量用括号括起来,前面加$就可以引用该变量的值

$(varname)

按照惯例makefile的变量都是大写(只是习惯而已,不是必须的)

CC=gcc
SRCS=test.c
OBJS=test.o
EXEC=test

start:test.o
    $(CC) -o $(EXEC) $(OBJS)
    @echo '----------ok----------'
$(OBJS):
    $(CC) -o $(OBJS) -c $(SRCS)
clean:
    rm -f $(OBJS)

OBJS可以简化为以下形式,相当于把.c替换为.o

OBJS=$(SRCS:.c=.o)
  • makefile完整版
.SUFFIXES:.c .o

CC=gcc
SRCS=test.c
OBJS=$(SRCS:.c=.o)
EXEC=test

start:test.o
    $(CC) -o $(EXEC) $(OBJS)
    @echo '----------ok----------'
.c.o:
    $(CC) -o $@ -c $<
clean:
    rm -f $(OBJS)

模式规则

.SUFFIXES:.c .o

表示任何x.c文件与x.o关联,make定义了一条规则,任何x.o文件都从 x.c编译而来

.c.o

make定义了一些有用的预定义变量

变量名含 义
$@规则的目标所对应的文件名
$<规则中的第一个相关文件名
  • makefile同时编译多个源文件
.SUFFIXES:.c .o

CC=gcc
SRCS=test.c \
    a.c

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

start:test.o
    $(CC) -o $(EXEC) $(OBJS)
    @echo '----------ok----------'
.c.o:
    $(CC) -o $@ -c $<
clean:
    rm -f $(OBJS)

常见的make出错信息

  • No rule to make target ‘target’.Stop
    makefile中没有包含创建指定target所需要的规则,而且也没有默认规则可用

  • ‘target’ is up to date
    指定的target相关文件没有变化

  • command:Command not found
    make找不到命令,通常是因为命令被拼写错误或者不在$PATH路径下

转载于:https://www.cnblogs.com/cj5785/p/10664777.html

相关文章:

  • cocos2dx笔记1:概述
  • 易语言QQpost加好友源码
  • Ansible-----常用功能
  • 2019春第六周学习编辑总结
  • 【感悟】一次不太好的寻找bug的体验,RecyclerView
  • mysql 命令启动
  • [题解]区间dp_luogu_P3147 262144
  • Permission denied: .gvfs
  • day2
  • JSP语法入门
  • 学习备忘英语单词转载
  • 存储的一些基本概念(HBA,LUN)
  • Kubenetes---Service--实践
  • HDU - 4352 XHXJ's LIS (数位dp)
  • 【*】深入理解redis主从复制原理
  • 【Linux系统编程】快速查找errno错误码信息
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • android图片蒙层
  • angular2开源库收集
  • jquery ajax学习笔记
  • JS学习笔记——闭包
  • Koa2 之文件上传下载
  • SegmentFault 2015 Top Rank
  • Spark学习笔记之相关记录
  • Spring Boot MyBatis配置多种数据库
  • sublime配置文件
  • Swift 中的尾递归和蹦床
  • vue自定义指令实现v-tap插件
  • XForms - 更强大的Form
  • 产品三维模型在线预览
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入口文件开始,分析Vue源码实现
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ![CDATA[ ]] 是什么东东
  • # Maven错误Error executing Maven
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)JAVA使用POI操作excel
  • (二)正点原子I.MX6ULL u-boot移植
  • (分布式缓存)Redis哨兵
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)基于IDEA的JAVA基础1
  • (转)h264中avc和flv数据的解析
  • **python多态
  • .Net Core 中间件验签
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)