最新要闻
- 精选! 《狂飙》“大嫂”高叶上手小米13:徕卡人像实拍样张美呆
- 天天时讯:3端通用!腾讯视频VIP会员年卡148元到手
- 当前快讯:董明珠称格力不看文凭只看能力:研究生到一线生产线非人才
- 济南动物园网红小黑猩猩“柒仔”去世:初步研判系突发疾病死亡
- 每日热议!奔驰4S店展车充新车 女子上门维权:被骗了、将走法律程序
- 天天快资讯丨突发!蔚来前实习生称遭同事强奸未遂 反被拒绝留用!公司:已成立调查组
- “清籁”琴
- 灭蟑螂小窍门厨房_灭蟑螂小窍门
- 【新要闻】如何去除新家的甲醛_如何去除新家的甲醛
- 环球热头条丨外星人AW620M无线鼠标上市:26000 DPI、140小时长续航
- 世界简讯:PC优化翻车!《卧龙:苍天陨落》官方道歉:将尽快推出更新补丁
- Pro版同款!荣耀Magic5至臻版影像泄露:5000万像素旗舰三摄
- 今日要闻!《LOL》英雄价格正式调整!全面下调
- 全球热议:理想L9车主实惨:白天打开星环模式灯 扣1分罚款100元?
- iPhone良品率不足50%也不怕 富士康又在印度设立新工厂
- 小鹏汽车欲靠P7“回血”:老款清库再降3.5万、新车下周上市
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
轻松玩转Makefile | 企业项目级Makefile实例
前言
本文展示了一个比较完整的企业项目级别的Makefile文件,包括了:文件调用,源文件、头文件、库文件指定,软件版本号、宏定义,编译时间,自动目录等内容。
(相关资料图)
1、目录架构
本文中所采用的目录架构,在企业项目开发中十分常见:源文件都放在src目录中,头文件都放在inc目录中,并且这两个目录都可以有对应的子目录。库文件放在lib目录中,makefile相关文件放在build目录中,编程生成的程序放在自动生成的output目录中。目录结构展示如下:
.├── build│ ├── Makefile│ └── srcpathconfig.mk├── code│ ├── inc│ │ ├── com│ │ └── func│ │ └── fun.h│ └── src│ ├── com│ │ └── main.c│ └── func│ └── fun.c└── lib ├── inc │ └── mylib.h └── libs └── libmylib.so
2、源文件及Makefile内容
本文所用到的所有文件,也可以直接到我的公众号,后台回复“ mk ”获取。
源文件
/* fun.h */#ifndef __FUN_H__#define __FUN_H__void fun();#endif/* fun.c */#include void fun(){#ifdef MACRO_DEF printf("macro definition enable!\n");#endif#ifdef COMPILER_IS_ARM_LINUX_GCC printf("The compilation target is arm!\n");#endif#ifdef COMPILER_IS_LINUX_GCC printf("The compilation target is linux!\n");#endifprintf("This is fun()!\n");}/* mylib.h */void mylib();/* libmylib.so */// mylib()函数,打印This is mylib()!/* main.c */#include "fun.h"#include "mylib.h"int main(){ fun();mylib(); return 0; }
srcpathconfig.mk
这个文件的内容,其实也可以放在Makefile中,本案例单独用一个文件来配置路径,是为了后期好管理
#源文件目录SRCCODEDIRS :=../code/src/func \ ../code/src/com \#头文件目录SRCHEADDIRS :=../code/inc/func \../code/inc/com \#lib文件目录LIBFILEDIRS := ../lib/libs#lib头文件目录LIBHEADDIRS := ../lib/inc/#lib文件LIBFILE := -lmylib
Makefile
#引用其他文件include srcpathconfig.mk#时间信息tmpbuildtm := `date |sed "s/ /_/g"`TMPBUILDTM = $(tmpbuildtm)#软件版本APPVERSION = 1.0.0.0#不同的目标采用不同的宏定义ifeq ($(MAKECMDGOALS),arm)COMPILEMACRO += COMPILER_IS_ARM_LINUX_GCCelseCOMPILEMACRO += COMPILER_IS_LINUX_GCC MACRO_DEFendif#循环获取源文件和中间件SRCFILE := $(foreach d,$(SRCCODEDIRS),$(wildcard $(addprefix $(d)/*,.c)))OBJFILE := $(patsubst %.c,%.o,$(SRCFILE))#宏定义,源文件路径,头文件路径CURCMPLMACRO := $(addprefix -D ,$(COMPILEMACRO))CURSRCHEADDIRS := $(addprefix -I ,$(SRCHEADDIRS))CURLIBHEADDIRS := $(addprefix -I ,$(LIBHEADDIRS))#程序输出路径OUTPUTDIR := ../output#编译器及选项CC := gccCFLAGS := -Wall -cRM := rmRMFLAGS := -rf#目标文件TARGETNAME = app$(TARGETNAME):$(OBJFILE)@mkdir -p $(OUTPUTDIR)@echo ""@echo "all files have been compiled , now begin to link every obj for excutable file"@echo ""@echo "linking............"@echo $(OBJFILE)@$(CC) -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)@echo ""@echo "linked ok," $(TARGETNAME) "has been created"@echo ""@echo $(TMPBUILDTM)%.o: %.c@echo ""@echo "start " $< "......compiling"@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@@echo "created " $@@echo "end " $< "......compiled ok"@echo "".PHONY: arm cleanarm:$(TARGETNAME)clean:@-$(RM) $(RMFLAGS) $(TARGETNAME) $(OBJFILE) $(OUTPUTDIR)
3、效果演示
输入make 或者 make arm ,打印如下
start ../code/src/func/fun.c ......compilingcreated ../code/src/func/fun.oend ../code/src/func/fun.c ......compiled okstart ../code/src/com/main.c ......compilingcreated ../code/src/com/main.oend ../code/src/com/main.c ......compiled okall files have been compiled , now begin to link every obj for excutable filelinking............../code/src/func/fun.o ../code/src/com/main.olinked ok, app has been createdFri_Mar__3_22:14:09_PST_2023
生成的文件架构如下
.├── build│ ├── Makefile│ └── srcpathconfig.mk├── code│ ├── inc│ │ ├── com│ │ └── func│ │ └── fun.h│ └── src│ ├── com│ │ ├── main.c│ │ └── main.o│ └── func│ ├── fun.c│ └── fun.o├── lib│ ├── inc│ │ └── mylib.h│ └── libs│ └── libmylib.so└── output └── app.1.0.0.0
运行output中生成的app.1.0.0.0程序
/* 由make命令编译生成的app.1.0.0.0 */macro definition enable!The compilation target is linux!This is fun()!This is mylib()
/* 由make arm命令编译生成的app.1.0.0.0 */The compilation target is arm!This is fun()!This is mylib()
4、Makefile内容解析
4.1 文件调用
include srcpathconfig.mk
相当于把srcpathconfig.mk的内容都拿过来,srcpathconfig.mk中的变量,在Makefile文件中都可以直接使用。
4.2 编译时间
tmpbuildtm := `date |sed "s/ /_/g"`TMPBUILDTM = $(tmpbuildtm)@echo $(TMPBUILDTM)
这个是把当前的时间,保存到TMPBUILDTM变量中,可以运用到源码中,本案例只是打印一下此变量。
4.3 软件版本
APPVERSION = 1.0.0.0@$(CC) -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)
开发过程中,我们会有多个版本的程序,可以在程序加上版本号作为后缀。
4.4 宏定义
ifeq ($(MAKECMDGOALS),arm)COMPILEMACRO += COMPILER_IS_ARM_LINUX_GCCelseCOMPILEMACRO += COMPILER_IS_LINUX_GCC MACRO_DEFendifCURCMPLMACRO := $(addprefix -D ,$(COMPILEMACRO))%.o: %.c@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@
makefile中也可以使用条件判断,具体用法这里不多做介绍。
MAKECMDGOALS,是make命令后面跟的目标,比如make arm,那么MAKECMDGOALS的值就为arm。
这里利用MAKECMDGOALS的值来选择使用哪些宏定义,假如make 后面跟的是arm,宏定义则是COMPILER_IS_ARM_LINUX_GCC,假如make后面跟的不是arm,宏定义则是COMPILER_IS_LINUX_GCC和MACRO_DEF。
这些宏定义在fun.c中有使用,对应的是打印不同的内容。在实际项目中,宏定义的作用很广,可以用来跨平台开发,也可以用来调试打印。
4.5 源文件及中间件
SRCFILE := $(foreach d,$(SRCCODEDIRS),$(wildcard $(addprefix $(d)/*,.c)))OBJFILE := $(patsubst %.c,%.o,$(SRCFILE))
由于我们的源文件是放在src目录下的不同子目录中,所以使用了foreach函数来循环获取。简单说明一下,foreach后面跟着的d,是中间变量,这一行的作用就是将SRCCODEDIRS的路径下的.c文件,逐个逐个拿出来,加上对应的路径前缀。
关于foreach的函数的具体使用方法,不做过多介绍。
4.6 头文件
SRCHEADDIRS :=../code/inc/func \../code/inc/com \LIBHEADDIRS := ../lib/inc/CURSRCHEADDIRS := $(addprefix -I ,$(SRCHEADDIRS))CURLIBHEADDIRS := $(addprefix -I ,$(LIBHEADDIRS))%.o: %.c@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@
将普通头文件和库头文件的存放路径单独用变量表示
4.7 库文件
LIBFILEDIRS := ../lib/libsLIBFILE := -lmylib$(TARGETNAME):$(OBJFILE)@$(CC) -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)
将库文件的名字和存放路径单独用变量表示
4.8 编译选项
CC := gccCFLAGS := -Wall -cRM := rmRMFLAGS := -rf
CC := gcc,指定编译器为gcc;CFLAGS 和RMFLAGS中的内容可以根据需求调整,所以单独拿出来,-Wall是表示编译的时候可以产生告警,便于分析。
4.9 自动目录
OUTPUTDIR := ../output@mkdir -p $(OUTPUTDIR)@-$(RM) $(RMFLAGS) $(TARGETNAME) $(OBJFILE) $(OUTPUTDIR)
make命令会自动创建output目录,用来存放生成的目标文件。
make clean会将此目录及目录中的所有内容都删除
4.10 打印信息
TARGETNAME = app$(TARGETNAME):$(OBJFILE)@mkdir -p $(OUTPUTDIR)@echo ""@echo "all files have been compiled , now begin to link every obj for excutable file"@echo ""@echo "linking............"@echo $(OBJFILE)@$(CC) -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)@echo ""@echo "linked ok," $(TARGETNAME) "has been created"@echo ""@echo $(TMPBUILDTM)%.o: %.c@echo ""@echo "start " $< "......compiling"@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@@echo "created " $@@echo "end " $< "......compiled ok"@echo ""
所有@echo的内容,都是为了编译的时候,打印一些信息,方便查看才加上去的,实际上有真正有用的是下面这些
TARGETNAME = app$(TARGETNAME):$(OBJFILE)@mkdir -p $(OUTPUTDIR)@$(CC) -o $(OUTPUTDIR)/$(TARGETNAME).$(APPVERSION) $(OBJFILE) -L$(LIBFILEDIRS) $(LIBFILE)%.o: %.c@$(CC) $(CURCMPLMACRO) $(CFLAGS) $(CURSRCHEADDIRS) $(CURLIBHEADDIRS) $< -o $@
————————————————————————————————
码字不易,点个赞再走吧!
欢迎关注我的同名公众号,这里有更多好料等着你哦!
-
【全球新要闻】(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目...
来源: 【全球新要闻】(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
轻松玩转Makefile | 企业项目级Makefile实例
精选! 《狂飙》“大嫂”高叶上手小米13:徕卡人像实拍样张美呆
天天时讯:3端通用!腾讯视频VIP会员年卡148元到手
当前快讯:董明珠称格力不看文凭只看能力:研究生到一线生产线非人才
济南动物园网红小黑猩猩“柒仔”去世:初步研判系突发疾病死亡
每日热议!奔驰4S店展车充新车 女子上门维权:被骗了、将走法律程序
天天快资讯丨突发!蔚来前实习生称遭同事强奸未遂 反被拒绝留用!公司:已成立调查组
“清籁”琴
环球观点:5-Nacos注册中心
灭蟑螂小窍门厨房_灭蟑螂小窍门
关于目录问题的总结-Python
天天即时看!实现js继承的几种方式以及他们的优缺点
今热点:AI修复图片画质和视频画质的方法
【热闻】数学建模(一):LP 问题
【新要闻】如何去除新家的甲醛_如何去除新家的甲醛
2023年2月随笔-难产的“学系列”
关注:乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 深入OpenAI与马斯克、微软的秘密,通过API轻松接入ChatGPT
天天热推荐:git clone的时候出现出现 fatal: unable to access 'https://github.com/...':OpenSSL
第125篇: 期约Promise基本特性
环球速递!kong和konga的安装部署
视焦点讯!腾讯云短信的使用方法
06while循环
环球热头条丨外星人AW620M无线鼠标上市:26000 DPI、140小时长续航
世界简讯:PC优化翻车!《卧龙:苍天陨落》官方道歉:将尽快推出更新补丁
环球头条:多线程全面总结
怎么注册微信公众号?
Pro版同款!荣耀Magic5至臻版影像泄露:5000万像素旗舰三摄
今日要闻!《LOL》英雄价格正式调整!全面下调
全球热议:理想L9车主实惨:白天打开星环模式灯 扣1分罚款100元?
iPhone良品率不足50%也不怕 富士康又在印度设立新工厂
小鹏汽车欲靠P7“回血”:老款清库再降3.5万、新车下周上市
降价后真香了!特斯拉中国2月销量出炉:暴涨130%
9.98万起杀疯!比亚迪王朝系列2月销量超10万台:秦PLUS贡献3成
2月新能源汽车销量榜:比亚迪一家占比近4成 第三名暴走
世界资讯:委员蒋胜男谈35岁职场危机:根源是“996” 必须改变
今日讯!中国性能车!全新领克03 TCR赛车官图发布:售价超百万
排查系统执行SQL与数据库直接执行结果不一致的问题
每日资讯:详细剖析|袋鼠云数栈前端框架Antd 3.x 升级 4.x 的踩坑之路
记录--手摸手带你撸一个拖拽效果
天天讯息:VSCode官方的配置同步方案
快报:144MB缓存立大功 AMD锐龙7000X3D内存自由:4800都稳赢i9
环球观点:AMD RX 7900 XT价格全面雪崩:沦落到RTX 4070 Ti的级别
《旷野之息》发售6周年:续作《塞尔达传说:王国之泪》发布新预告
当前视点!中国围棋第一人易主!李轩豪超越柯洁 AI立大功
环球快讯:vivo推出“手语翻译官”应用:准确率可达80%以上
网络通信——TCP “三次握手“、“四次挥手“ 详解
PHP语言在线代码运行编译工具推荐
今日报丨JavaScript 回调函数属于闭包?
全球快看:ChatGPT开放API,上来就干到最低价,可以人手一个ChatGPT了
全球新动态:Spring事务使用注意事项
【全球独家】限制儿童支付金额方便了!微信青少年模式升级:一键开启上线
三排七座!仰望U8内饰曝光:比亚迪首款百万豪车来了
世界热门:刚失败一次后 日本不放弃:新一代运载火箭尝试再度发射
热到离谱?首个冲上20℃的北方省会诞生 下周或破30℃
欧洲2035年禁售燃油车要黄?德国公然反对!意大利:我也不同意
环球精选!登月用!中国新一代载人火箭预计2027年首飞
天天即时:《狂飙》“大嫂”高叶上手小米13:女神持机美如画
全球观速讯丨火山引擎 DataTester:A/B 实验如何实现人群智能化定向?
环球快资讯丨Redis分布式锁常见坑点分析
世界今日讯!eas里客户端保存,提交里增加校验规则和必填
访问者模式
世界微动态丨网友偶遇眼镜王蛇求助 博物杂志:务必远离、打输住院打赢坐牢
世界今亮点!Vtuber因直播《霍格沃茨之遗》被骚扰 宣布毕业
天天讯息:委员建议研究生招生规模动态扩大:缓解考研难
全球聚焦:收个滴滴Offer:从小伙三面经历,看看需要学点啥?
环球热资讯!Study for Go! Chapter one - Type
环球最新:手写模拟Spring底层原理-Bean的创建与获取
速看:兰博基尼领衔 今年值得期待的7款跑车 买不起还不能看看?
女子试用期被辞退 现场给HR普法:金句频出网友点赞称解气
每日聚焦:靠ChatGPT年入百万!合法还不限学历专业:一般人我不告诉他(doge)
全球新消息丨韩系车日子不好过!起亚狮铂拓界限时优惠:降3万还给大礼包
zip文件结构
头条:与时俱进推动智慧城市建设,智慧管网监测加强城市治理能力
全球视讯!Java项目集成工作流activiti,会签
简单介绍Python中如何给字典设置默认值
播报:LG:三星QD OLED电视更容易烧屏
世界聚焦:掏耳朵怎么就这么爽!
今日视点:不只全面屏!努比亚Z50 Ultra后摄惊艳:黄金镜皇组合
男子月薪3千相亲角“反向相亲”气到大妈 大爷理解:靠颜值吃饭
每日热文:吴京+杰森斯坦森主演!《巨齿鲨2》暑期上映 国内有望同步
环球视点!ffmpeg视频上传及压缩Linux配置篇下
世界快资讯:【Avalonia】【跨平台】关于Prism项目模块化在Linux下路径问题
浙大揭秘吃鱼为什么会变聪明 网友:告诉老默 我想吃鱼了
上海消保委提醒谨慎购买威马汽车:经营异常、消极应对投诉
特斯拉将放弃稀土材料 中国公司无惧:目前没有东西替代
即时:B站两款自研游戏将上线 CEO陈睿:能挣钱的游戏只剩下两种
《生化危机4:重制版》新演示/截图 里昂拯救黑丝碍事梨
焦点日报:配置资源管理Secret和ConfigMap
环球视点!Windows故障转移群集 和 SQLServer AlwaysOn 搭建教程
(数据库系统概论|王珊)第九章关系查询处理和关系优化-第一节:查询处理
全球速递!视频上传及压缩SpringBoot篇上
世界热门:el-input 使用 回车键会刷新页面的问题
全球最强!传音260W快充手机将亮相:10分钟内充满
性能对标奔驰大G 比亚迪“F品牌”首车曝光:够硬够强
世界快消息!传欧盟准备批准微软收购动视-暴雪
当前报道:女司机“神操作”:100来公里高速连撞4次 竟甩锅路太窄
世界视讯!又一大作优化翻车!《卧龙:苍天陨落》RTX 4090依旧闪退
12GB+256GB到手仅2699元!Redmi K60正式开启降价
温州特斯拉事故驾驶员家属发声:记不清车辆失控场景 妻子去世自责