《一些通用的Makefile文件模板.docx》由会员分享,可在线阅读,更多相关《一些通用的Makefile文件模板.docx(14页珍藏版)》请在第壹文秘上搜索。
1、写在前面对于WindOWS下开发,很多IDE都集成了铜译器,如ViSUaIStUdi0,提供了“一裸编洋,编码完成后只需一个操作即可完成痂洋、健接、生成目标文件.1.jnUX开发与WindoWS不同.UnUX卜一般用的的gccg+漏译器,如果是开发ARM下的1.inUX程庠,还需用到arm-Iinuxgccarm-HnUX-g+交叉编评器。1.inux下也可以实现一域编译功能,此时需要一个编译脚本Makefi1.e-.Makefi1.e可以手动编写,也可以借助自动化构建工具(如sconsCMake)生成“手动编写Makefi1.e是1.inux和Windows程序员的区别之一,一般地一个通用的
2、Makefi1.e能够适合大部分1.inUX项目程序.个Makefi1.e模板2.1 耀译可执行文件Makefi1.eversion-.eecc=gCCDEBUG-OUSEeDEBUGCF1.AGS=Wa1.1.SOURCES-$(wiIdcard./source/4.c)INC1.UDES=I./inc1.ude1.IBNAMES-Ifuna-IfunsoO3三S(patsubst%.C,%.o,S(SOURCES)TARGET=app1.inksJ(TARGET):$(OBD)Ikdir-output(CC)$(08)J(IIBPATH)KIIB-NAMES)ooutput/$(TARGE
3、T)$(VERSION)rf$(0B3)compi1.e%.o:%.c$(CC)S(INCIUOS)“DEBUG)-cJ(CF1.AGS)$o.PHONY:c1.eanc1.ean:ChoRemove1.inkedandCOmPiICdfi1.es*r-rfS(OBJ)S(TARGET)output【要点说明】1程序版本开发谓试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。VERSION1.0S(CC)$(0BJ)$(1.I8_PATH)$(1.IB_NAMES)-OOUtPUt/(TARGET)$VERS1.ON)2编译器选界1.inux卜,为gccg+:arm下为arm-
4、IinUX-gcc:不同CPU厂商提供的定制交叉编洋器名称可能不同,如HiSiIiConarm-hisiv300-1.inux-gcc”.cc=gcc【3】宏定义开发过程,特殊代码一般增加宏条件来选择是否漏洋,如调试打印输出代码.-D是标识,后面接若的是“宏DEBUG-DUSE_0EBU6【4】译选项可以指定漏洋条件,如显示警告(-Wa1.1.),优化等级JO).CF1.AGS-Wa1.1.-O5源文件指定源文件目的路径,利用“Wi1.dCad”获取路径下所有依敕源文件.SOURCES-(wi1.dcard./source/*.c)【6】头文件包含依赖的头文件,包括源码文件和厚文件的头文件.I
5、NC1.UDES=-I./inc1.ude【7】库文件名称指定库文件名称,库文件有固定格式,伸态摩为IibXXX.a;动态库为IibXXXSO,指定库文件名称只需写“XXX”部分,1.IBeNAMES-Ifun_a-Ifun_so【8】库文件路径指定依他摩文件的存放路径。注愈如果引用的是动态库,动态库也许拷贝到/Iib或者”/usr/1.ib”目录下,执行应用程序时,系统默认在该文件下索弓I动态库.IIB-PATH-1./Iib19目标文件调用patsubst将源文件(c)编译为廿标文件。.OBJ=S(patsubst%.c,X.o1.(SOURCES)rio执行文件执行文件名称TARGET-
6、app11编译x.o:%.c$(CC)$(INC1.UDES)(DEBUG)$(CF1.AGS)$-O$112俄接可创建一个output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件.。).S(TARGET):$(0B3)kdir-poutput$(Ce)$(083)S(1.I8.PATH)$(1.IB_NAMES)-Ooutput/$(TARGET).$(VERSION)rE-rf$(0BJ)r13清除编译信息执行makec1.ean除嫡泽产生的临时文件。.PHONYrc1.eanc1.ean:echo,Remove1.inkedandcompi1.edfi1.
7、es*rmrf$(0BJ)(TARGT)output2.2 编译的态库Makefi1.eVERSION-CC三gccDEBUG-CF1.AGS-Wa1.1.ARarARF1.AGS=rvSOURCES-wi1.dcard.c)INC1.UDES=-I.IIBNAMES-O3$(pat$ub$t%.C9%.o,!(SOURCES)TARGET=1.1.bfun-att1.ikJ(TARGET):$(OBD)Ikdir-output$(AR)J(ARFIAGS)OutputZJ(TARGET)S(VERSION).a$(0BJ)rm-rfS(OBJ)compi1.eX-o:%.c$(CC)$(IN
8、C1.UDES)(DEBUG)-CS(CF1.AGS)$-O.PHONY:c1.eanc1.ean:echoRemove1.inkedandcompi1.edfi1.esre-rf$(003)S(TARGET)output【要点说明】基本格式与“编译可执行MakefiIe”一致,不同点包括以下.【1】使用到“ar”命令将目标文件(.。)链接成静态库义件(.a)静态阵文件固定命名格式为:IibXXX.a.2.3 修译动态岸Makefi1.eVERSIONCCgccDEBUGCF1.AGS-fPIC-shared1.F1.AGS-fPIC-sharedSOURCES三S(wi1.dcardx.c)
9、INC1.UDES-I.1.IBNAMES三1.IBePATHOBJ(PatSUbSt%.otJ(SOURCS)TARGET-Iibfunsoii1.inkS(TARGET):S(OBJ)ikdir-poutput$(CC)J(OBJ)$(1.IBePATH)$(1.IB_NAMES)J(1.F1.AGS)-OOUtputS(TARGET)$(VERSION).$0-rS(OBJ)Ucompi1.e$(CC)$(INC1.UDES)S(DEBUG)-CS(CF1.AGS)$-O.PHONY:c1.eanc1.ean:echoRemove1.inkedandcompi1.edfi1.esr-rf
10、$(003)S(TARGET)output【要点说明】基本格式与“编译可执行MakefiIe”一致.不同点包括以下.1编译选项和链接选项增加JfPIC-shared”选项。动态库文件固定命名格式为1.ibxxx.so.Demo3.1 片骨应用程序编写测试例程,文件存放目录结构如下,头文件存放在inc1.ude目录,库文件存放在-Hb目录,海文件存放在source目录,Makefi1.e在当前目录下,root01.oca1.host:/mnt/hgfs/1.SW/Makefi1.e#treefun.hfun1.hfun1.ib三.hfun_1.ib_so.hF1.ibfun-a.a1- Iibf
11、unso.soMakefi1.efun.cfun1.cmain,c源码1:/头文件/*ifndef_FUNB_H_力define.FUNH*endifexternvoidfun-printf(void);externvoidfun1.-rintf(void);/文件/inc1.ude力inc1.udefun0.hvoidfun-printf(void)(pri11tf(-Ca1.1.,fu11,.rn);)源码2:文件/ndefFUN1.HdefineFUN1.Hendifexternvoidfu111.-printf(void);/源文件/Inc1.udeinc1.ude*funi.hvoi
12、dfun1.printf(void)(printfCCa1.1.,fu111.r11);)主函数源码:/源文件/inc1.udeinc1.udeu.h,*inc1.udefuni.htinc1.ude*fun_1.ib_a.h,inc1.udewfun1.ib.so.h-i11twain(void)(#ifdefUSEDEBUGrintf(*DebugApp1.icationstartup,rn,);*endiffun.printf();un1._pr1.nt();fun1.iba.printf();un-1.ib-so-pr1.t();return8;)阵文件,1.ib目录下存放两个库文件,
13、一个静态库IibfUn_a.a.一个动态库IibfUn_so.so。Makefi1.e文件M为2.1节的Makefi1.e模板.测试运行:root01.oa1.host:Mth9fsisvakefi1.e*ukcrace-!./inc1.ude-DUSEOeBUG-wa1.1.csorcefune.c-osourcefun.oncc-1./inc1.ude-DUSDBUG-wa1.1.-csorcefu1.cosourcefu1.orace-!./inc1.udeDUSCDeBUG-wa1.1.-cso.o./source/fun1.o./source/Min.o-I./Ub-Uuna-Uun
14、10ooutput/app1.GGroot01.oca1.hostnthgfs1.SWMakef1.ef./output/app1.MDcMqApp1.icationstartup.kai1.,fun.Ca1.1.,fun.pu,funUba*.kaUfunUbso.如果执行文件提示无1.ibfu11.so.so,W1.JTm拷贝1.ibfun_so.so到根目录下的或者”usr1.ib1目录下,因为系统执行程序,默认从该路径引脚动态库】3. 2生成静态库编写测试例程,生产的阵文件即为31%”调用的库文件1.ibfun-a.a),文件存放目录结构如下:root1.oca1.host:mnthgfs/1.SW/MUb/sourcea#treeIf