分享一个很通用c语言的Makefile
编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦;而痛苦则是,写代码已经很累了,写完代码还要编写Makefile,这多出来的一点工作,很有点最后一根稻草的感觉。
最近整理手头的几个项目,把C语言类的Makefile抽象、合并了一下,形成了一个比较通用的编译脚本,这里分享一下:
#定义编译器
CC=gcc
#自己特定的编译参数,这里仅为示例,这个参数是消除mac编译openssl类程序用的
CFLAGS += -Wno-deprecated-declarations
#定义输出文件夹,outs默认等于是./outs
OUTSDIR = outs
#定义.o中间文件的路径,这个路径编译完成可以清除
TMPSDIR = objs
#源代码路径
VPATH=src
#扫描所有的c源码,这里默认src中所有文件都是相当于库文件,最终编译为.o
#搜索出来的文件包含了src路径,这里也去掉,便于后面编译到临时目录
OBJSSOURCE = $(notdir $(wildcard src/*.c))
OBJS = $(patsubst %.c,%.o,$(OBJSSOURCE))
#主程序名
KEYS = main
DEPS = $(addprefix $(TMPSDIR)/,$(OBJS))
.PHONY : all
all:$(OBJS) $(KEYS)
#编译所有的库文件由.c至.o
#因为VPATH的存在,源文件会自动检索src目录
$(filter %.o,$(OBJS)) : %.o : %.c
$(CC) $(CFLAGS) -c -o $(TMPSDIR)/$@ $<
#利用所有的库文件编译主程序
$(KEYS): $(DEPS)
$(CC) $(CFLAGS) -o $(OUTSDIR)/$(notdir $@) $(notdir $@).c $(DEPS)
#清理
.PHONY : clean
clean:
-rm $(OUTSDIR)/* $(TMPSDIR)/*
这个编译脚本的主要特点是自动扫描所有的源文件,然后逐个编译,对于大多c类的项目,基本只需要定义一下主程序就可以完成编译了,其实根据同样的原理连主程序都一起扫描、编译也是可以的,只是似乎自由度太差了。
脚本简单修改可以适应各种环境,比如下面再贴一个ios使用的,ios如果非越狱的话,直接编译成可执行文件是没有意义的,这里我们假设编译成.a库文件,供xcode来调用:
#ios交叉编译器
CC=$(shell xcrun --sdk iphoneos --find clang)
_SFLAG=$(shell xcrun --sdk iphoneos --show-sdk-path)
#iphone6以后都是arm64了,所以这里不再考虑armv7,另外也不考虑模拟器运行了
#如果有需要可以根据自己的需求修改
CFLAGS += -Wno-deprecated-declarations -isysroot $(_SFLAG) -arch arm64 -mios-version-min=9.3 -fembed-bitcode
OUTSDIR = outs
TMPSDIR = objs
VPATH=src
OBJSSOURCE = $(notdir $(wildcard src/*.c))
OBJS = $(patsubst %.c,%.o,$(OBJSSOURCE))
DEPS = $(addprefix $(TMPSDIR)/,$(OBJS))
#最后生成的库
KEYS = libcallfunctions.a
.PHONY : all
all:$(OBJS) $(KEYS)
#编译所有的库文件由.c至.o
$(filter %.o,$(OBJS)) : %.o : %.c
$(CC) $(CFLAGS) -c -o $(TMPSDIR)/$@ $<
#将.o文件打包为库
libcallfunctions.a : $(DEPS)
ar -r $(OUTSDIR)/libcallfunctions.a $(DEPS)
#清理
.PHONY : clean
clean:
-rm $(OUTSDIR)/* $(TMPSDIR)/*
在主要的编译环节,还有下面这种常用的办法,只是自己运算得到了源文件名而没有用Make系统的自动搜索功能而已:
%.o:
$(CC) $(CFLAGS) -c -o $(TMPSDIR)/$@ src/$(patsubst %.o,%.c,$@)
对于更复杂的编译模式,建议把每个编译环节定义成子程序来执行,可以具备更多的灵活性。另外当前这个脚本有一个bug就是每次编译实际上所有的.o文件都会完整重新编译一遍,而没有判断源文件是否更新并忽略没有更新的源文件,所以不适合大的系统。
分享一个很通用c语言的Makefile的更多相关文章
- android:分享 一个很强大的LOG开关---Log.isLoggable
标签:android分享 一个很强大的log开 1.API亮点: 此API可以实现不更换APK,在出问题的手机上就直接能抓到有效log,能提升不少工作效率. 2.API介绍 最近在解决短信问题时,看到 ...
- 分享一个很好用的 日期选择控件datepicker 使用方法分享
很多同学在做网站的时候,有时候需要用户选择日期,年月日这些的,以前我也在用一个,但是那个的界面都不太好看,于是找啊找,找啊找,找到一个好东西,就是这个,datepicker,是jquery.ui里面的 ...
- 分享一个很早之前写的小工具DtSpyPlus
几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip
- 分享一个很好看的WPF界面
今天在http://www.iopenworks.com/Products/ProductDetails/Introduction?proID=386 上面看到的,先mark下来...... 地址:h ...
- 分享一个强大的采集类,还可以模拟php多进程
做采集的时候,可以使用file_get_contents()去获取网页源代码,但是使用file_get_contents采集,速度慢,而且超时时间,不好控制.如果采集的页面不存在,需要等待的时间很长. ...
- 分享一个漂亮按钮插件FancyButtons
一转眼,2018年的第10天就这样过去了.回看17年,曾经做了些啥都忘记了,就像每一天写日志时的样子(双手放在键盘上,怒着嘴,抬着头,望着天花板), 然后突然记得好像好久没有写随笔了(@_@).自从配 ...
- Makefile经典教程(一个很棒很清晰的讲解)【转】
转自:https://blog.csdn.net/seven_amber/article/details/70216216 该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神 ...
- 一步一步写一个简单通用的makefile(三)
上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
随机推荐
- python一些好文章链接收藏
程序员之路:python3+PyQt5+pycharm桌面GUI开发 python-nmap的函数学习 python标准库中socket模块详解 python队列Queue 简单认识python cm ...
- BUAA面向对象设计与构造——第二单元总结
BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...
- kali渗透-基础篇
渗透之meterpreter 模拟场景:小明是我室友,整天游戏人生,浑浑噩噩,前途迷茫,每次上课交作业都要看我的,于是我开启了apche服务器,给他下载作业(别问我为什么不用QQ传,因为要装逼!),他 ...
- Y1O001波分复用器
# 波分复用器## 光分波器### 波分合波器种类* 耦合型 * 光纤熔融拉锥 * 熔融拉锥法是指将两根(或两根以上)除去涂覆层的光纤以一定的方法靠拢,在高温加热下熔融,同时向两侧拉伸,最终在加热区形 ...
- AT与ATX电源 - 1 系统状态
ATX与AT电源比较 ATX电源普遍应用在PC中,它有两套电源,一个是正常操作使用:12V,5V,3.3V和-12V,还有一个独立的5V待机电源,所谓的待机电源就是其ON的充要条件是AC输入存在,而正 ...
- [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
- 《SpringMVC从入门到放肆》八、SpringMVC注解式开发(基本配置)
上一篇我们结束了配置式开发,配置式开发目前在企业中用的并不是很多,大部分企业都在使用注解式开发,所以今天我们就来学习注解式开发.所谓SpringMVC注解式开发是指,处理器是基于注解的类的开发方式.对 ...
- Vue 中动态添加class(使用v-bind:class)
今天在Vue中动态修改类名,元素的样式就是不改变,类名也没有加上去,里面的问题具体我还是不太清楚,有可能是因为自己不认真,把 :class= 后面的内容的格式给整错了,下面将正确的做法记录一下,便于以 ...
- win10企业版永久激活方法
步骤: 1.右键点击桌面左下角"windows"图标,点击打开“命令提示符” 2.复制命令:slmgr.vbs /upk,按回车确定,弹出窗口显示“成功地卸载了产品密钥” 3.复制 ...