Linux的Makefile-电子版课件_第1页
Linux的Makefile-电子版课件_第2页
Linux的Makefile-电子版课件_第3页
Linux的Makefile-电子版课件_第4页
Linux的Makefile-电子版课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

Linux开发MakefileMakefile总述Makefile的语法使用makefile管理工程内容总述Makefile的语法使用makefile管理工程总述Makefile关系到整个工程的编译规那么;Makefile带来的好处是“自动化编译”;我们熟悉的开发工具实际上自动完成的makefile的创立工作。如:Tornado,Windows的IDE等。总述-程序的编译和链接C或是C++,首先要把源文件变成中间代码,在linux在是“.o”文件,这个一步动作叫做编译〔compile〕;把大量的中间文件集合起来合并成一个可执行文件,这个过程叫做链接〔link〕;在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”〔LibraryFile),在linux,是ArchiveFile,也就是.a文件,或者是动态库.so文件。总述-makefile的总体规那么如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接;如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序;如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。总述-make如何工作当我们在终端输入make命令后 1〕make命令会在当前目录下找名字叫“Makefile”或“makefile”的文件; 2〕如果找到,它会找文件中的第一个目标,需要注意的是,第一个目标是makefile的最终目标; 3〕如果makefile的第一个目标所需要的条件不符合或者是第一个目标所依赖的文件比已经生成的目标文件新,就找下一个目标来生成第一个目标所依赖的条件; 这就是整个Make的依赖性,make会一层一层的去找依赖关系,并最终编译出第一个目标文件。总述-makefile的内容Makefile里主要包含了五个东西:显式规那么、隐晦规那么、变量定义、文件指示和注释。 -显示规那么:说明如何生成一个或多的的目标文件; -隐晦规那么:make有自动推导的功能,所以隐晦的规那么可以让我们比较粗糙地简略地书写Makefile -变量定义:变量一般都是字符串 -文件指示:在一个Makefile中引用另一个Makefile或者是指根据某些情况指定Makefile中的有效局部或者是定义一个多行命令 -注释:注释是用“#”字符。 最需要注意的是:在Makefile中的命令,必须要以[Tab]键开始总述-makefile的文件名默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,建议使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,比较醒目。最好不要用“GNUmakefile”,这个文件是GNU的make识别的;当然也可以自己定义makefile的文件名,比方“make.linux”,“make.vxworks”等,这样在make是就需要指定文件名了。如:make-fMake.Linux总述-make的工作方式1、读入所有的Makefile。2、读入被include的其它Makefile或文件。3、初始化文件中的变量。4、推导隐晦规那么,并分析所有规那么。5、为所有的目标文件创立依赖关系链。6、根据依赖关系,决定哪些目标要重新生成。7、执行生成命令。思考为什么需要makefileMakefile是怎么工作的?内容总述Makefile的语法使用makefile管理工程makefile的语法target...:prerequisites... command ... ...target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签;prerequisites就是,要生成那个target所需要的文件或是目标;command也就是make需要执行的命令〔任意的Shell命令〕。make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。makefile的语法-最简单的makefile关联多个源文件的makefilehello:hello.ofunc.o

gcchello.ofunc.o-ohellohello.o:hello.c

gcc-chello.c-ohello.ofunc.o:func.cfunc.h

gcc-cfunc.c-ofunc.omakefile的语法-使用变量定义变量:变量名=值调用变量:$(变量名)在多处使用同样的信息时变量非常有用。makefile的语法-使用变量修改上面的例子PROC=helloCC=gccSOURCES=hello.cfunc.cOBJECTS=hello.ofunc.o$(PROC):$(OBJECTS) $(CC)-o$(PROC)$(OBJECTS)hello.o:hello.c $(CC)-ohello.o-chello.cfunc.o:func.cfunc.h $(CC)-ofunc.o-cfunc.c

makefile的语法-让make自己推导GUN的make是非常强大的,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。;只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,比方make找到一个hello.o那么hello.c就会是它的依赖文件。

makefile的语法-让make自己推导所以上面的例子可以变的非常简单:PROC=helloCC=gccOBJECTS=hello.ofunc.o$(PROC):$(OBJECTS)执行这个make输出的结果:gcc

-c-ohello.ohello.cgcc

-c-ofunc.ofunc.cgcc

hello.ofunc.o

-ohello

makefile的语法-常用变量名称说明缺省CCC编译器ccCFLAGSC参数CXXC++编译器g++CXXFLAGSC++参数CPPC预处理,输出处理结果$(CC)-ECPPFLAGS预处理参数ARarARFLAGSAR参数LDFLAGS链接参数makefile的语法-常用变量条件处理过程%.o<-%.c$(CC)-c$(CPPFLAGS)$(CFLAGS)%.o<-%.c,%.cpp,%.cc$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)无扩展名<-需求的对象$(CC)

$(LDFLAGS)$(LOADLIBES)

$(LDLIBS)makefile的语法-自动生成依赖性在Makefile中,我们的依赖关系可能会需要包含一系列的头文件如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在参加或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作;大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系;如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。

makefile的语法-自动生成依赖性举例:如果main.c包含头文件“defs.h”gcc-Mmain.c的输出是:

main.o:main.cdefs.h/usr/include/stdio.h/usr/include/features.h\/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h\/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h\/usr/include/bits/types.h/usr/include/bits/pthreadtypes.h\/usr/include/bits/sched.h/usr/include/libio.h\/usr/include/_G_config.h/usr/include/wchar.h\/usr/include/bits/wchar.h/usr/include/gconv.h\/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h\/usr/include/bits/stdio_lim.hgcc-MMmain.c main.o:main.cdefs.hmakefile的语法-伪目标通常情况下makefile文件的第一个目标为最终目标,后续目标和最终目标存在依赖关系;伪目标并不是一个输出文件,只是一个标签;可以通过一个特殊的标记“.PHONY”来向make说明,这是一个伪目标;很显然直接执行“make”是不会执行伪目标的,但是可以通过执行“make目标”的方式来实现;

makefile的语法-伪目标hello:hello.ofunc.o

gcchello.ofunc.o-ohellohello.o:hello.c

gcc-chello.c-ohello.ofunc.o:func.cfunc.h

gcc-cfunc.c-ofunc.o.PHONY:cleanclean:rm–rfhellohello.ofunc.omakefile的语法-伪目标从上面的例子可以看出,通过执行“makeclean”命令可以删除所有的目标文件makefile的语法-伪目标伪目标也可以嵌套,例如:.PHONY:cleanobjcleanhellocleanobj: rm–rf*.oCleanhello: rm–rfhello 我们可以输入“makecleanobj”或者“makecleanhello”命令以到达删除不同文件的目的。makefile的语法-函数在makefile中经常会使用到函数来让我们的规那么更加灵活;$(<function><arguments>)或是${<function><arguments>}<function>是函数名,<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。makefile的语法-函数注意:为了风格的统一,函数和变量的括号最好一样,如使用“$(substa,b,$(x))”这样的形式,而不是“$(substa,b,${x})”的形式。makefile的语法-函数一个例子:comma:=,empty:=space:=$(empty)$(empty)foo:=abcbar:=$(subst$(space),$(comma),$(foo))在这里例子中$(bar)的最终取值为“a,b,c”makefile的语法-函数$(strip<string>) 名称:去空格函数——strip。 功能:去掉<string>字串中开头和结尾的空字符。 返回:返回被去掉空格的字符串值。 例如:$(stripabc)->abc$(findstring<find>,<in>) 名称:查找字符串函数——findstring。 功能:在字串<in>中查找<find>字串。 返回:如果找到,那么返回<find>,否那么返回空字符串。 例如:$(findstringa,abc)->’a’$(findstringa,bc)->‘’makefile的语法-函数$(filter<pattern...>,<text>) 名称:过滤函数——filter。 功能:以<pattern>模式过滤<text>字符串中的单词,保存符合模式<pattern>的单词。可以有多个模式。 返回:返回符合模式<pattern>的字串。例如:sources:=foo.cbar.cbaz.sugh.hfoo:$(sources)cc$(filter%.c%.s,$(sources))-ofoo$(filter%.c%.s,$(sources))返回的值是“foo.cbar.cbaz.s”。makefile的语法-函数$(sort<list>)名称:排序函数——sort。功能:给字符串<list>中的单词排序〔升序〕。返回:返回排序后的字符串。例如:$(sortfoobarlose)返回“barfoolose”。备注:sort函数会去掉<list>中相同的单词。makefile的语法-函数$(dir<names...>)

名称:取目录函数——dir。功能:从文件名序列<names>中取出目录局部。目录局部是指最后一个反斜杠〔“/”〕之前的局部。如果没有反斜杠,那么返回“./”。返回:返回文件名序列<names>的目录局部。例如:$(dirsrc/foo.chacks)返回值是“src/”。makefile的语法-函数$(addsuffix<suffix>,<names...>)

名称:加后缀函数——addsuffix。功能:把后缀<suffix>加到<names>中的每个单词后面。返回:返回加过后缀的文件名序列。例如:$(addsuffix.c,foobar)返回值是“foo.cbar.c”。makefile的语法-函数foreach函数 foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的。 $(foreach<var>,<list>,<text>) 这个函数的意思是,把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串〔以空格分隔〕将会是foreach函数的返回值。makefile的语法-函数一个例子:names:=abcdfiles:=$(foreachn,$(names),$(n).o)

上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.ob.oc.od.o”。makefile的语法-函数$(error<text...>)产生一个致命的错误,<text...>是错误信息$(warning<text...>)这个函数很像error函数,只是它并不会让make退出,只是输出一段警告信息,而make继续执行makefile的语法-条件判断使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值;语法为:<conditional-directive><text-if-true>else<text-if-false>endif其中<conditional-directive>表示条件关键字“ifeq”,“ifneq”,“ifdef”,“ifndef”makefile的语法-条件判断一个例子libs_for_gcc=-lgnunormal_libs=foo:$(objects)ifeq($(CC),gcc) $(CC)-ofoo$(objects)$(libs_for_gcc)else $(CC)-ofoo$(objects)$(normal_libs)endif思考如何使用变量;如何使用函数;条件判断有什么用?内容总述Makefile的语法使用makefile管理工程使用makefile管理工程在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而不至于把所有的东西全部写在一个Makefile中;我们把位于最上层的makefile称为总控makefile。使用makefile管理工程例如:

有一个子目录叫subdir,这个目录下有个Makefile文件,来指明了这个目录下文件的编译。那么总控的Makefile可以这样书写: subsystem:cdsubdir&&$(MAKE)

这个例子的意思是说先进入subdir,再执行这个目录中的“make”,执行完成后会离开这个子目录。使用makefile管理工程-实例以An6016-01系统的命令行进程为例说明使用makefile管理工程的做法。目录说明备注prj_cli命令行进程源码目录该目录下的makefile为总控,同时还有makefile的配置文件config.mkprj_msc所有功能库的源码目录该目录下makefile为编译库的总控makefileprj_msc/bridge_clientBridge客户端源码目录该目录下的makefile仅控制本目录下的源码编译prj_msc/bridge_defunBridge命令行源码目录该目录下的makefile仅控制本目录下的源码编译prj_msc/bridge_includeBridge头文件目录该目录下的makefile仅控制本目录下的源码编译prj_msc/service_clientservice客户端源码目录该目录下的makefile仅控制本目录下的源码编译prj_msc/service_defunservice命令行源码目录该目录下的makefile仅控制本目录下的源码编译prj_msc/service_includeservice头文件目录该目录下的makefile仅控制本目录下的源码编译prj_msc/target库目标文件目录该目录makefile负责生成动态库/静态库prj_cli/target总目标文件目录该目录下的makefile控制所有目标文件的链接生成最终的可执行文件makefile管理工程实例-配置文件通常情况将对一个工程的通用性描述、变量定义,工程平台定义等内容专门定义一个配置文件,同一个工程不同目录的makefile都可以应用这个配置文件,这样以后的修改只用修改这个配置文件即可。提高维护性能。makefile管理工程实例-配置文件#######################################compileconfigfile#usedinallthemodules'makefile######################################TARGET_ARCH:=x86#定义目标板架构为X86LIB_TYPE:=a#定义库的类型为静态库ifndefTARGET_ARCH TARGET_ARCH:=x86endififndefLIB_TYPE LIB_TYPE:=soendififeq($(TARGET_ARCH),ppc)#根据不同的架构定义交叉编译环境 CROSS_COMPILE:=ppc_85xx- BINDIR:=/opt/montavista/pro/devkit/ppc/85xx/binelse CROSS_COMPILE:= BINDIR:=/usr/binendif#根据目标框架定义常用工具AS :=$(BINDIR)/$(CROSS_COMPILE)asCC :=$(BINDIR)/$(CROSS_COMPILE)gccCXX :=$(BINDIR)/$(CROSS_COMPILE)g++CPP :=$(BINDIR)/$(CC)-ELD :=$(BINDIR)/$(CROSS_COMPILE)ldAR :=$(BINDIR)/$(CROSS_COMPILE)arNM :=$(BINDIR)/$(CROSS_COMPILE)nmSTRIP :=$(BINDIR)/$(CROSS_COMPILE)stripOBJCOPY:=$(BINDIR)/$(CROSS_COMPILE)objcopyOBJDUMP:=$(BINDIR)/$(CROSS_COMPILE)objdumpRANLIB :=$(BINDIR)/$(CROSS_COMPILE)ranlib#定义公共文件目录PUBLICDIR:=$(shellcd$(ROOTDIR);cd../public;pwd)定义根目录TOPMOST:=$(shellcd$(ROOTDIR);cd..;pwd)#附加的包含头文件路径,各工程自己添加ADDINCLUDE:=$(TOPMOST)/prj_msc/msc_commADDINCLUDE+=-I$(TOPMOST)/prj_msc/include-I$(TOPMOST)/prj_msc/service_include-I$(TOPMOST)/prj_msc/bridge_include\ -I$(TOPMOST)/prj_onu_manage/include-I$(TOPMOST)/prj_msc/maintain_includemakefile管理工程实例-配置文件#根据目标板架构定义CFLAGS环境变量ifeq($(TARGET_ARCH),ppc)CFLAGS:=-I/opt/montavista/pro/devkit/ppc/85xx/target/usr/include\ -I/opt/montavista/pro/devkit/ppc/85xx/target/usr/include/glib-2.0\ -I/opt/montavista/pro/devkit/ppc/85xx/target/usr/lib/glib-2.0/include\ -I$(ROOTDIR)/include-I$(PUBLICDIR)-I$(ADDINCLUDE)CFLAGS+=-DLINUX=1-DUNIX=1-Dlinux-D__linux__-Dunix-D_GNU_SOURCE\-DLINUX_OS-Wallelse CFLAGS:=-I$(ROOTDIR)/include-I/usr/include/glib-2.0\ -I/usr/lib/glib-2.0/include\ -I$(PUBLICDIR)-I$(ADDINCLUDE)CFLAGS+=-DLINUX_OS-DTARGET_X86-WallEndififeq($(TARGET_ARCH),ppc) LDFLAGS:=-L$(ROOTDIR)/targetelse LDFLAGS:=-L$(ROOTDIR)/targetendififeq($(TARGET_ARCH),x86) CFLAGS+=-O0-ggdb LDFLAGS+=-O0-ggdbelse CFLAGS+=-Os LDFLAGS+=-OsendifLIBS:=pthreadmakefile管理工程实例-总控makefile〔prj_cli〕CURDIR :=$(shellpwd) #获取当前目录include$(CURDIR)/config.mk #包含配置文件#定义该模块包含的目录MODULES:=../publicavlclilibmodulesusermanagetarget#定义本程序包含库的源码文件路径LIBMODULES:=../prj_mscall: #最终目标 #用来指示工程路径

echo$(CURDIR)>../public/project.mk

#用来指示目标环境

echo"/*本文件由Makefile重建,不要编辑*/">../public/target.h#根据平台框架指定公共头文件ifeq($(TARGET_ARCH),x86) echo"#defineTARGET_X861">>../public/target.h echo"#undefTARGET_PPC">>../public/target.h

else echo"#defineTARGET_PPC1">>../public/target.h echo"#undefTARGET_X86">>../public/target.hendif #循环指定各个库源码目录的makeformodulein$(LIBMODULES);domake-w-C$$modulemsclib;done

#用来指示工程路径 echo$(CURDIR)>../public/project.mk#循环执行本进程源码各个目录的makefile formodulein$(MODULES);domake-w-C$$moduleall;done

clean: #伪目标循环去除所有目录包括子目录生成的目标文件 echo$(CURDIR)>../public/project.mk formodulein$(MODULES);domake-w-C$$moduleclean;done formodulein$(LIBMODULES);domake-w-C$$moduleclean;donemakefile管理工程实例-总控makefile〔prj_msc〕################################################################################Totalmakefiletocompiletheprojectand#whichdecidedbythevariable:################################################################################CURDIR :=$(shellpwd)include$(CURDIR)/config.mkMODULES:=../publicmsc_commmsc_multi_clientmsc_multi_servermsc_multi_virtual_svr\bridge_serverservice_serverbridge_marshalservice_marshaltargetMSCMODULES:=msc_commONUMODULES:=msc_onu_apimsc_onu_libESWMODULES:=msc_esw_apimsc_esw_libSERVICEMODULES:=service_marshalservice_clientmaintain_marshalmaintain_clientmaintain_serverBRIDGEMODULES:=bridge_marshalbridge_clientDEFUNMODULES:=bridge_defunservice_defunmaintain_defuntargetmakefile管理工程实例-总控makefile〔prj_msc〕本makefile的功能与prj_cli目录makefile相似,目的也只是循环编译各个子模块〔子目录〕的源码生成目标文件;从上面的变量定义可以看出,建议有多少个子模块就需要定义几个变量。makefile管理工程实例-target目录makefile〔prj_msc〕目的是为了将已经生成的所有源码的目标文件〔.o〕文件关联生成动态库〔.so〕或者静态库〔.a〕;将生成的库文件拷贝到prj_cli的目标文件夹中。makefile管理工程实例-target目录makefile〔prj_msc〕TOPDIR :=$(shellpwd)ROOTDIR:=$(shellcd..;pwd)include$(ROOTDIR)/config.mkSOURCE:=$(wildcard*.c)$(wildcard*.cpp)OBJS:=$(patsubst%.c,%.o,$(patsubst%.cpp,%.o,$(SOURCE)))ONULIB:=libmsc_onu_lib.soESWLIB:=libmsc_esw_lib.soSERVICELIB:=libservice_client_lib.soBRIDGELIB:=libbridge_client_lib.soSERVICEDEFUNLIB:=libservice_defun_lib.soBRIDGEDEFUNLIB:=libbridge_defun_lib.soMAINTAINDEFUNLIB:=libmaintain_defun_lib.soMAINTAINLIB:=libmaintain_client_lib.somsclib: $(CC)-L.-fpic-shared-o$(ONULIB)$(TOPMOST)/prj_msc/msc_onu_lib/msc_onu_cli.o-lmsc_onu_api-lmsc_comm $(CC)-L.-fpic-shared-o$(ESWLIB)$(TOPMOST)/prj_msc/msc_esw_lib/msc_esw_client.o-lmsc_esw_api-lmsc_comm $(CC)-L.-fpic-shared-o$(SERVICELIB)$(TOPMOST)/prj_msc/service_client/*.o\ -lservice_marshal-lmaintain_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(BRIDGELIB)$(TOPMOST)/prj_msc/bridge_client/msc_bridge_client.o-lbridge_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(MAINTAINLIB)$(TOPMOST)/prj_msc/maintain_client/*.o-lmaintain_marshal-lmsc_comm $(CC)-L.-fpic-shared-o$(SERVICEDEFUNLIB)$(TOPMOST)/prj_msc/service_defun/*.o $(CC)-L.-fpic-shared-o$(BRIDGEDEFUNLIB)$(TOPMOST)/prj_msc/bridge_defun/*.o $(CC)-L.-fpic-shared-o$(MAINTAINDEFUNLIB)$(TOPMOST)/prj_msc/maintain_defun/*.omakefile管理工程实例-target目录makefile〔prj_msc〕cp$(ONULIB)$(TOPMOST)/prj_cli/target cp$(ESWLIB)$(TOPMOST)/prj_cli/target cp$(SERVICELIB)$(TOPMOST)/prj_cli/target cp$(BRIDGELIB)$(TOPMOST)/prj_cli/target cp$(SERVICEDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(BRIDGEDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(MAINTAINDEFUNLIB)$(TOPMOST)/prj_cli/target cp$(MAINTAINLIB)$(TOPMOST)/prj_cli/target

makefile管理工程实例-模块子目录Makefile子目录的makefile仅负责将本目录下的源码生成目标文件;所有子目录下的makefile都是一样的,所以给我们的makefile维护工作带来了极大的便利。makefile管理工程实例-模块子目录Makefile########################################moudlemakefile#######################################TOPDIR :=$(shellpwd)#本目录为多工程共享,注意根目录设置方法ROOTDIR:=$(shellcd../../public;catproject.mk)include$(ROOTDIR)/config.mkLIB =$(shellbasename$(TOPDIR)).$(LIB_TYPE)SOURCE:=$(wildcard*.c)$(wildcard*.cpp)OBJS:=$(patsubst%.c,%.o,$(patsubst%.cpp,%.o,$(SOURCE)))all: $(LIB)msclib: $(LIB)cliprog: $(LIB)$(LIB): $(OBJS)ifeq(

温馨提示

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

评论

0/150

提交评论