Linux基础之多模块编译和链接_第1页
Linux基础之多模块编译和链接_第2页
Linux基础之多模块编译和链接_第3页
Linux基础之多模块编译和链接_第4页
Linux基础之多模块编译和链接_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

讲师:杨行系列课程—Linux基础多模块编译和链接第七章课程目标具备搭建linux系统平台能力系统安装具备Linux系统日常维护能力文件,目录结构linux的常用命令,ViShell脚本编程、管道及其重定向tftp,nfs服务器的配置熟悉Linux系统下的开发环境Gcc,Gdb课程安排第一天

上午:Linux系统简介和安装下午:Linux安装实际演练第二天

上午:Linux基本操作命令下午:Linux基本操作命令实战第三天上午:Linux进程操作

下午:Linux服务器配置第四天

上午:Linux脚本编程上下午:Linux脚本编程下第五天

上午:源代码编译和调试下午:多模块软件的编译和链接(预科内容,根据实际情况调整授课天数,4-10天)课前提问Make–f文件,是什么文件

?目标类表:关联性列表含义是什么?如何定义简单变量?举一个make内置变量的例子本章目标Make实用程序的功能使用makefile管理多模块软件makefile的规则,变量makefile的虚目标规则Makefile常见错误和调试实用的软件都是拥有多个源文件这些源文件称之为模块多模块软件多模块软件优点缺点较小的程序文件易于维护知道所有文件的依赖性只需编译经过修改的源文件,而不是编译整个系统跟踪所有文件修改的时间戳支持信息隐藏必须键入很长的命令行知识点1-Make一个差强人意的办法使用shell脚本上述的缺点,导致了make的产生。$catbuild.scgcc–cprog1.cprog2.cprog3.cgcc–oprogprog1.oprog2.oprog3.oMake工程管理器,顾名思义,是指管理较多的文件Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作Make将只编译改动的代码文件,而不用完全编译。Make管理多模块程序的编译和连接读取一个说明文件---Makefile描述系统中各模块的依赖关系make使重编译的次数达到最小化Makefile描述的依赖关系各组件文件的时间戳Makefile实质上是一种脚本语言Make语法make[选项]

[目标]

[宏定义]

目的Make程序更新文件是基于存放在一个文件中的依赖关系,称为Makefile。Make常用选项特性-d显示调试信息-f<文件>指定从哪个文件中读取依赖关系信息。默认文件是”Makefile”或“makefile”“-”表示从标准输入-h显示所有选项的简要说明-n不运行任何Makefile命令,只显示他们-s安静的方式运行,不显示任何信息Make知识点2—Makefile文件Makefile是Make读入的唯一配置文件由make工具创建的目标体(target),通常是目标文件或可执行文件要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)注意:命令行前面必须是一个”TAB键”,否则编译错误为:***missingseparator.Stop.目标列表:关联性列表

<Tab>命令列表目标列表:关联性列表;命令列表也称为先决条件Makefile文件Makefile格式1target:dependency_files<TAB>command例子hello.o:hello.chello.h gcc–chello.c–ohello.oMakefile格式2target:dependency_files;command例子hello.o:hello.chello.h;gcc–chello.c–ohello.o注释#连接符\关联列表和命令列表中使用shell通配符?*[…]与shell脚本的相同Makefile文件实例源码power.c#include<math.h>#include<stdio.h>Voidmain(){floatx,y;printf("theprogramtakexandfromstdinanddisplaysx^y.\n");printf("enternumberx:");scanf("%f",&x);printf("enternumbery:");scanf("%f",&y);printf("x^yis%6.3f\n",pow((double)x,(double)y));}$catMakefile#Samplemakefileforthepowerprogram#Remember:eachcommandlinestartswithaTABpower:power.c gccpower.c-opower–lm$制表符<Tab>Makefile文件把power.c分成两个文件#include<stdio.h>doublecompute(doublex,doubley);main(){floatx,y;printf("theprogramtakexandfromstdinanddisplaysx^y.\n");printf("enternumberx:");scanf("%f",&x);printf("enternumbery:");scanf("%f",&y);printf("x^yis%6.3f\n",compute(x,y));}#include<math.h>doublecompute(doublex,doubley){return(pow((double)x,(double)y));}Makefile文件power.ocompute.opower:power.ocompute.o gccpower.ocompute.o-opower-lmMakefile文件-依赖树power.ocompute.opower:power.ocompute.o gccpower.ocompute.o-opower-lmpower.o:power.c gcc–cpower.ccompute.o:compute.c gcc–ccompute.cpower.ccompute.c$makegcc-cpower.cgcc-ccompute.cgccpower.ocompute.o-opower—lm树中节点的处理是自底向上的,由叶结点的父节点开始Makefile文件-依赖树当目标文件比关联文件更新更新关联文件,对比$makemake:’power’isuptodate$touchpower.C$makegccpower.c–opower–lm仅仅只更新文件的修改时间为当前时间目标文件存在,且比关联文件更新重新编译更新的关联文件Makefile文件进一步分成六个文件,建立依赖树$catcompute.c#include<math.h>#include”compute.h”doublecompute(doublex,doubley){return(pow((double)x,(double)y));}$catmain.h/*Declarationofpromptstousers*/constchar*PROMPTl=”Enterthevalueofx:”;constchar*PROMPT2=”Enterthevalueofy:”;$catinput.C#include”input.h”doubleinput(constchar*s){floatx;printf(”%s”,s);scanf(“%f”,&x);return(x);}$catinput.h/*Declarationofthe”input”function*/doubleinput(char*);catcompute.h/*Declarationofthe“compute”function*/doublecompute(double,double);Makefile文件-依赖树$catmain.c#include<stdio.h>#include”main.h”#include”compute.h”#include”input.h”main(){doublex,y;printf(”TheprogramtakesXandYfromstdinanddisplaysx^y.\n”);x=input(PROMPTl);y=input(PROMPT2);printf(”x^yis:%6.3f\n”,compute(x,y));}Makefile文件-依赖树$catmakefilepower:main.oinput.ocompute.ogccmain.oinput.ocompute.o-opower-1mmain.o:main.cmain.hinput.hcompute.hgcc-cmain.cinput.o:input.cinput.hgcc-cinput.ccompute.o:compute.ccompute.hgcc-ccompute.c$$makegcc-cmain.cgcc-cinput.cgcc-ccompute.cgccmain.oinput.ocompute.o-opower-1m1.第一个先决条件不存在,或者先决条件作为目标文件的先决条件更新。生成第一个2.当所有的先决条件更新后,生成最终目标文件Makefile文件-依赖树-默认的后缀规则SUFFIXES:.o.c.s.c.o: $(CC)$(CFLAGS)-c$<.s.o: $(AS)$(ASFLAGS)-o$@$<-默认的模式规则(gnuMake)%.o:%.c: $(CC)$(CFLAGS)-c$<%.o:%.s $(AS)$(ASFLAGS)-o$@$<-利用默认的规则修改后的makefile$catmakefilepower:main.oinput.ocompute.o gccmain.oinput.ocompute.o-opower-lmmain.o:main.hinput.hcompute.hinput.o:input.hcompute.o:compute.h内置变量,以后会经常遇到知识点3-Makefile的规则和变量Makefile的规则和变量一个复杂一些的例子sunq:kang.oyul.o gcckang.obar.o-omyprogkang.o:kang.ckang.hhead.h gcc–Wall–O-g–ckang.c-okang.oyul.o:bar.chead.h gcc-Wall–O-g–cyul.c-oyul.o注释:-Wall:表示允许发出gcc所有有用的报警信息.-c:只是编译不链接,生成目标文件”.so”-ofile:表示把输出文件输出到file里Makefile的规则和变量创建变量的目的:用来代替一个文本字符串:1.系列文件的名字

2.传递给编译器的参数

3.需要运行的程序

4.需要查找源代码的目录

5.你需要输出信息的目录

6.你想做的其它事情。简单变量定义:变量名:=[文本]添加:变量名+=[文本]引用$(变量名)${变量名}$单字符变量C=gcc$CMakefile的规则和变量变量定义的两种方式递归展开方式VAR=var简单方式VAR:=var变量使用$(VAR)用”$”则用”$$”来表示刚才的例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$(OBJS)-osunqkang.o:kang.ckang.h $(CC)$(CFLAGS)-ckang.c-okang.oyul.o:yul.cyul.h $(CC)$(CFLAGS)-cyul.c-oyul.oMakefile的规则和变量$catmakefileCC:=gccOPTIONS:=-O3OBJECTS

:=main.oOBJECTS

+=

input.ocompute.oSOURCES:=main.cinput.ccompute.cHEADERS:=main.hinput.hcompute.hpower:$(OBJECTS)$(CC)$(OPTIONS)-opower

$(OBJECTS)-lmmain.o:main.hinput.hcompute.hinput.o:input.hcompute.o:compute.hpower.tar:makefile$(HEADERS)$(SOURCES)tar-cvfpower.tarmakefile$(HEADERS)$(SOURCES)clean:rm–rf*.o$Makefile的规则和变量-简单变量实例变量名意义$@当前目标的名称$?比当前目标更新的已修改的依赖性列表$<比当前目标更新的已修改的依赖性名称$^用空格分开的所有依赖性列表Makefile的规则和变量-内置变量complete:power@echo”Buildcomplete”power:$(OBJECTS) $(CC)$(OPTIONS)-O$@$^-lm@echo”Theexecutableisinthepowerfile.”main.o:main.hinput.hcompute.hcompute.o:compute.hinput.o:input.hpower.tar:makefile$(HEADERS)$(SOURCES) tar-cvf$@$^clean: rm-rf*.ocorepower虚目标Makefile的规则和变量Make进行处理的依据包括目标体、依赖文件及其之间的命令语句

隐式规则模式规则Makefile的规则和变量隐式规则隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$^-o$@Makefile的规则和变量AR归档维护程序的名称,默认值为ar。

ARFLAGS归档维护程序的选项。

AS汇编程序的名称,默认值为as。

ASFLAGS汇编程序的选项。

CC

C编译器的名称,默认值为cc。

CFLAGS

C编译器的选项。

CPP

C预编译器的名称,默认值为$(CC)-E。

CPPFLAGS

C预编译的选项。

CXX

C++编译器的名称,默认值为g++。

CXXFLAGS

C++编译器的选项。

FC

FORTRAN编译器的名称,默认值为f77。

FFLAGS

FORTRAN编译器的选项。Makefile的规则和变量常见隐式规则目录C编译:.c变为.o $(CC)–c$(CPPFLAGS)$(CFLAGS)C++编译:.cc或.C变为.o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pascal编译:.p变为.o$(PC)-c$(PFLAGS)Fortran编译:.r变为-o$(FC)-c$(FFLAGS)。Makefile的规则和变量模式规则模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用make默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化了Makefile的编写模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明Makefile的规则和变量模式规则下OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$^-o$@%.o:%.c $(CC)$(CFLAGS)-c$<-o$@Makefile的规则和变量例子2(main.cmain.h)OBJ=main.ohello:$(OBJ)$(CC)$^-o$@%.o:%c$(CC)-c$<-o$@clean:$(RM)helloMakefile的规则和变量不存在的文件,而且也无需创建他们允许你强制执行某些事件,而这些事件在正常规则中是不会发生的规则虚目标和先决条件如果虚目标作为先决条件使用,它必须作为目标出现在某处虚目标总是使与之有关的命令被执行虚目标作为先决条件,总是相应的目标重建知识点4-Makefile的虚目标常见虚目标列表目标意义all生成工程中所以可以执行者,通常是makefile的第一个生成目标test运行程序的自动测试套件clean删除makeall生成的所有文件install在系统目录中安装工程项目生成的可执行文件和文档uninstall删除makeinstall安装的所有文件Makefile的虚目标$catmakefileINSTALLDIR=/home/sarwar/courses/bininstall:clientserver cp–f$^$(INSTALLDIR) rm–f*.o$^ cd$(INSTALLDIR);chmod755$^uninstall:

cd$(INSTALLDIR);rmclientserver client:client.omiscc.orcopyc.o gccclient.omiscc.orcopyc.o–lnsl-oclient\ client.o:etc.hrcopy.h gcc-cclient.c$makeinstall.......不存在的文件,仅为完成某些功能Makefile的虚目标上述问题用.PHONY的特殊目标解决.PHONY:cleanclean:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论