第4章嵌入式Linux程序开发基础_第1页
第4章嵌入式Linux程序开发基础_第2页
第4章嵌入式Linux程序开发基础_第3页
第4章嵌入式Linux程序开发基础_第4页
第4章嵌入式Linux程序开发基础_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4章章 嵌入式嵌入式Linux程序开发基础程序开发基础本章要点本章要点 1、嵌入式、嵌入式Linux编译器编译器GCC的使用的使用2、“文件包含文件包含”处理处理3、Make命令和命令和Makefile文件文件4、嵌入式、嵌入式Linux汇编语言程序设计基础知识汇编语言程序设计基础知识5、Linux Shell编程方法编程方法 6、位运算、位运算4.1 嵌入式嵌入式Linux编译器编译器 4.1.1 Linux下下C语言编译过程语言编译过程1、编辑器、编辑器2、编译链接器、编译链接器3、调试器、调试器4、项目管理器、项目管理器4.1.2 GCC编译器编译器1、GCC编译器编译器 GCC编译

2、器能将编译器能将C、C+语言源程序、汇编语言源程序、汇编语言源程序和目标程序编译、连接成可执语言源程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,行文件,如果没有给出可执行文件的名字,GCC将自动生成一个名为将自动生成一个名为a.out的文件。的文件。2、GCC的执行过程的执行过程 预处理预处理(也称预编译,也称预编译,Preprocessing)、编、编译译(Compilation)、汇编、汇编(Assembly)和连接和连接(Linking)。 System-Administration-Software Sources3、GCC的基本用法和选项的基本用法和选项 GCC

3、最基本的用法最基本的用法 gcc options filenames -c:只编译,不连接成为可执行文件。:只编译,不连接成为可执行文件。 -o output_filename:确定输出文件的名称为:确定输出文件的名称为output_filename,同时这个名称不能和源文件,同时这个名称不能和源文件同名。同名。 -g:产生符号调试工具:产生符号调试工具(GNU的的gdb)所必要的符所必要的符号资讯,要想对源代码进行调试,我们就必须加号资讯,要想对源代码进行调试,我们就必须加入这个选项。入这个选项。 -O:对程序进行优化编译、链接,采用这个选项,:对程序进行优化编译、链接,采用这个选项,整个源

4、代码会在编译、链接过程中进行优化处理,整个源代码会在编译、链接过程中进行优化处理,产生的可执行文件的执行效率较高。产生的可执行文件的执行效率较高。4.2“文件包含文件包含”处理处理1、头文件、头文件在在C语言中,需要利用头文件来定义结构、语言中,需要利用头文件来定义结构、常量以及声明函数的原型。大多数常量以及声明函数的原型。大多数C的头文的头文件都存放在件都存放在 /usr/include及其子目录下。及其子目录下。引用以上目录中的头文件在编译的时候无引用以上目录中的头文件在编译的时候无需加上路径,但如果程序中引用了其他路需加上路径,但如果程序中引用了其他路径的头文件,需要在编译的时候用径的头

5、文件,需要在编译的时候用 I 参数。参数。2、“文件包含文件包含”处理处理“文件包含文件包含”处理,意思是把另外一个源文处理,意思是把另外一个源文件的内容包含到本程序中来。其作用是减件的内容包含到本程序中来。其作用是减少编写程序的重复劳动,即把一些要重复少编写程序的重复劳动,即把一些要重复使用的东西,编写到一个使用的东西,编写到一个“头文件头文件”(*.h)中,然后在程序中用中,然后在程序中用include命令来实现命令来实现“文件包含文件包含”的操作。的操作。例如:例如:n=1+2+3+100 求和运算。求和运算。1#include 2int main() 3int x=100,s=0,i=

6、1;5while(i=x) 6s=s+i;7i+;89printf( sum= %dn,s);10 return 0;11为了让加法部分能重复使用,将加法部分写为了让加法部分能重复使用,将加法部分写成一个函数成一个函数int sum(int n)。 int mysum(int n)int i=1,ss=0;while(i=n)ss=ss+i;i+;return (ss);再在主函数中调用它再在主函数中调用它 1#include 2int mysum(int n);3int main()45int x=100;6int s=0;7s=mysum(x);8printf( sum= %dn,s);9

7、return 0;10注意:上述程序中的第注意:上述程序中的第2行语句行语句 int mysum(int n);是必不可少的。由于是必不可少的。由于mysum(int n)函数的定函数的定义是从第义是从第11行语句开始,而调用行语句开始,而调用mysum(int n)函数的语句在第函数的语句在第7行。因此,要在调用之前行。因此,要在调用之前声明这个函数。声明这个函数。 下面进一步将程序中具有下面进一步将程序中具有独立功能的独立功能的mysum()函数分割函数分割出来。该程序可分割为下列出来。该程序可分割为下列3个个程序:程序:mysum.h、mysum.c和和ex_sum.c。(1)程序)程序

8、mysum.h:1 /* mysum.h */2 int mysum(int n);(2)程序)程序mysum.c:1. /* mysum.c */2. int mysum(int n)3. 4. int i=1,ss=0;5. while(i=n)6. ss=ss+i;7. i+;8.9. return (ss);10. (3)主程序)主程序ex_sum.c:1. /* ex_sum.c */2. #include 3. #include mysum.h4. int main()5. 6. int x=100;7. int s=0;8. s=mysum(x);9. printf(sum=%d

9、n,s);10. return 0;11. 在在Linux环境下,执行编译程序命令:环境下,执行编译程序命令:gcc ex_sum.c mysum.c -o sum此命令将此命令将ex_sum.c和和 mysum.c编译成一个编译成一个在在Linux环境下的可执行文件环境下的可执行文件sum。在在Linux环境下运行可执行文件环境下运行可执行文件sum,./sum结果如下:结果如下:sum=50504.3Make命令和命令和Makefile工程工程管理管理 4.3.1认识认识Make编写一个编写一个Makefile文件如下:文件如下:sum: ex_sum.o mysum.o gcc ex_s

10、um.o mysum.o -o sumex_sum.o:ex_sum.cgcc -c ex_sum.cmysum.o: mysum.c mysum.hgcc -c mysum.c注意,注意, “gcc ex_sum.c mysum.c -o sum”前面不前面不是空格,而是按下是空格,而是按下“tab”键的符号位。键的符号位。将其保存为:将其保存为:makefile,文件名没有后缀。然后,文件名没有后缀。然后,在在Linux环境下执行环境下执行make,其运行结果如下:,其运行结果如下:# makegcc -c ex_sum.cgcc -c mysum.cgcc ex_sum.o mysum.

11、o -o sum将将ex_sum.c和和 mysum.c编译成在编译成在Linux环境下的环境下的可执行文件可执行文件sum。 Makefile 是是 一个配置文件一个配置文件Makefile 中通常包含如下内容:中通常包含如下内容: 需要由需要由make 工具创建的目标体,工具创建的目标体, 通常是通常是目标文件或可执行文件;目标文件或可执行文件; 要创建的目标体所依赖的文件;要创建的目标体所依赖的文件; 创建每个目标体时需要运行的命令。创建每个目标体时需要运行的命令。Makefile的格式为:的格式为:target: dependency_files command示例示例main: ma

12、in.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o: main.cgcc -c main.cmytool1.o: mytool1.c mytool1.hgcc -c mytool1.cmytool2.o: mytool2.c mytool2.hgcc -c mytool2.c该程序有该程序有mytool1.h、mytool2.h、mytool1.c、mytool2.c 等文件需要编译。等文件需要编译。编写编写Makefile文件:文件:再次运行再次运行make,这时,这时,make 会自动检会自动检查相关文件

13、的时间戳。查相关文件的时间戳。 首先,在检查首先,在检查“main”、“main.o”、“ mytool1.o”和和“mytool2.o”这这3 个文件的时间戳之前,它会向下个文件的时间戳之前,它会向下查找那些把查找那些把“main.o”、“ mytool1.o”或或“mytool2.o”作为目标文件的时间戳。如果这些文作为目标文件的时间戳。如果这些文件中任何一个的时间戳比它们新,则用件中任何一个的时间戳比它们新,则用gcc命令将此命令将此文件重新编译。这样,文件重新编译。这样,make 就完成了自动检查时间就完成了自动检查时间戳的工作,开始执行编译工作。这也就是戳的工作,开始执行编译工作。这

14、也就是 Make 工作工作的基本流程。的基本流程。 4.3.2 Makefile 变量变量 为了进一步简化编辑和维护为了进一步简化编辑和维护 Makefile,make 允许在允许在 Makefile 中创建和使用变量。中创建和使用变量。变量是在变量是在 Makefile 中定义的名字,用来代替中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量一个文本字符串,该文本字符串称为该变量的值。的值。 在在Makefile 中的变量定义有两种方式:一种中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式。是递归展开方式,另一种是简单方式。 递归展开方式的定义格式为:递归展开方式的定义

15、格式为:VAR=var。简单扩展方式的定义格式为:简单扩展方式的定义格式为:VAR:=var。 Make 中的变量无论采用哪种方式定义使用中的变量无论采用哪种方式定义使用时格式均为:时格式均为:$(VAR)。例如例如OBJS = main.o mytool1.o mytool2.oCC = gccmain: $(OBJS) $(CC) $(OBJS) -o mainmain.o: main.c$(CC) -c main.cmytool1.o: mytool1.c mytool1.h$(CC) -c mytool1.cmytool2.o: mytool2.c mytool2.h$(CC) -c

16、mytool2.c进一步简化进一步简化OBJS = main.o mytool1.o mytool2.oCC = gccmain: $(OBJS) $(CC) $ -o $main.o: main.c$(CC) -c $ -o $mytool1.o: mytool1.c mytool1.h$(CC) -c $ -o $mytool2.o: mytool2.c mytool2.h$(CC) -c $ -o $4.3.3 Makefile 规则规则 Makefile 的规则是的规则是 Make 进行处理的依进行处理的依据,它包括了目标体、依赖文件及其之间的据,它包括了目标体、依赖文件及其之间的命令

17、语句。一般的,命令语句。一般的,Makefile 中的一条语句中的一条语句就是一个规则。就是一个规则。 1隐式规则隐式规则 在使用在使用Makefile时,有一些语句经常使时,有一些语句经常使用,而且使用频率非常高的东西,隐式规则用,而且使用频率非常高的东西,隐式规则能够告诉能够告诉 make使用默认的方式来完成编译使用默认的方式来完成编译任务,这样,当用户使用它们时就不必详细任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列指定编译的具体细节,而只需把目标文件列出即可。出即可。Make 会自动按隐式规则来确定如会自动按隐式规则来确定如何生成目标文件。何生成目标文件。

18、 例如例如OBJS = main.o mytool1.o mytool2.oCC = gccmain: $(OBJS) $(CC) $ -o $2.模式规则模式规则模式规则规定,在目标文件的定义时需要用模式规则规定,在目标文件的定义时需要用“%”字符。字符。“%”的意思是表示一个或多个的意思是表示一个或多个任意字符,与文件名匹配。任意字符,与文件名匹配。 例如:例如:“%.c”表示以表示以“.c”结尾的文件名(文结尾的文件名(文件名的长度至少为件名的长度至少为3),而),而“s.%.c”则表示以则表示以“s.”开头,开头,“.c”结尾的文件名(文件名的长结尾的文件名(文件名的长度至少为度至少为

19、5个字符)。个字符)。例如例如OBJS = main.o mytool1.o mytool2.oCC = gccmain: $(OBJS) $(CC) $ -o $%.o: %.c$(CC) -c $ -o $ 4.3.4 make4.3.4 make命令的使用命令的使用4.4嵌入式嵌入式Linux汇编语汇编语言程序设计言程序设计汇编语言的优点是执行速度快,可以直接对汇编语言的优点是执行速度快,可以直接对硬件进行操作。硬件进行操作。 嵌入式嵌入式Linux系统下用汇编语言编写程序有两系统下用汇编语言编写程序有两种不同的形式:种不同的形式:1、完全汇编代码、完全汇编代码2、内嵌汇编代码、内嵌汇编

20、代码4.4.1嵌入式嵌入式Linux汇编语言格式汇编语言格式1、嵌入式、嵌入式Linux汇编语言程序结构汇编语言程序结构在嵌入式在嵌入式Linux汇编语言程序中,程序是以汇编语言程序中,程序是以程序段(程序段(Section)的形式呈现的。程序段)的形式呈现的。程序段是具有特定名称的相对独立的指令或数据是具有特定名称的相对独立的指令或数据序列。序列。程序段分为代码段(程序段分为代码段(Code Section)和数)和数据段(据段(Data Section)两种类型。代码段)两种类型。代码段的主要内容为执行代码,而数据段则存放的主要内容为执行代码,而数据段则存放代码段运行时需要用到的数据。代码

21、段运行时需要用到的数据。一个汇编语言程序至少要有一个代码段。一个汇编语言程序至少要有一个代码段。2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式嵌入式嵌入式Linux汇编语言的语法格式和汇编语言的语法格式和DOS/Windows 下的汇编语言语法格式有较大的差异。下的汇编语言语法格式有较大的差异。DOS/Windows 下的汇编语言代码都是下的汇编语言代码都是 Intel格式,格式,而嵌入式而嵌入式Linux的汇编语言代码采用的是的汇编语言代码采用的是 AT&T 格格式,两者在语法格式上有着很大的不同式,两者在语法格式上有着很大的不同(1)在)在 AT&T 汇编

22、格式中,寄存器名要加上汇编格式中,寄存器名要加上 % 作为前缀;而在作为前缀;而在 Intel 汇编格式中,寄存汇编格式中,寄存器名不需要加前缀。器名不需要加前缀。 2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(2)在)在 AT&T 汇编格式中,用汇编格式中,用 $ 前缀表示一个前缀表示一个立即操作数;而在立即操作数;而在 Intel 汇编格式中,立即数的表汇编格式中,立即数的表示不用带任何前缀。示不用带任何前缀。(3)AT&T 和和 Intel 格式中的源操作数和目标操作格式中的源操作数和目标操作数的位置正好相反。在数的位置正好相反。在 Intel 汇编格

23、式中,目标操汇编格式中,目标操作数在源操作数的左边;而在作数在源操作数的左边;而在 AT&T 汇编格式中,汇编格式中,目标操作数在源操作数的右边。目标操作数在源操作数的右边。 2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(4)在)在 AT&T 汇编格式中,操作数的字长由操作汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀符的最后一个字母决定,后缀b、w、l分别分别表示操作数为字节(表示操作数为字节(byte,8 比特)、字(比特)、字(word,16 比特)和长字(比特)和长字(long,32比特);而在比特);而在 Intel 汇汇编格式中,操作数

24、的字长是用编格式中,操作数的字长是用 “byte ptr” 和和 “word ptr” 等前缀来表示的。等前缀来表示的。 (5)在)在 AT&T 汇编格式中,绝对转移和调用指令汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上)的操作数前要加上*作为前缀,而在作为前缀,而在 Intel 格式中则不需要。格式中则不需要。 2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(6)在)在 AT&T 汇编格式中,内存操作数的寻址方汇编格式中,内存操作数的寻址方式是式是section:disp(base, index, scale) 而在而在 Intel

25、汇编格式中,内存操作数的寻址方式汇编格式中,内存操作数的寻址方式为:为:section:base + index*scale + disp4.4.2嵌入式嵌入式Linux汇编程序示例汇编程序示例【例例4-3】编写一个最简单的编写一个最简单的AT&T 格式的汇格式的汇编程序。编程序。用编辑工具编写如下汇编源程序,并将其用编辑工具编写如下汇编源程序,并将其保存为保存为hello.s。 #hello.s.data # 数据段声明数据段声明msg : .string Hello, world!n # 要输出的字符串要输出的字符串len = . - msg # 字串长度字串长度.text # 代

26、码段声明代码段声明.global _start # 指定入口函数指定入口函数_start: # 在屏幕上显示一个字符串在屏幕上显示一个字符串movl $len, %edx # 参数三:字符串长度参数三:字符串长度movl $msg, %ecx # 参数二:要显示的字符串参数二:要显示的字符串movl $1, %ebx # 参数一:文件描述符参数一:文件描述符(stdout)movl $4, %eax # 系统调用号系统调用号(sys_write)int $0 x80 # 调用内核功能调用内核功能 # 退出程序退出程序movl $0, %ebx # 参数一:退出代码参数一:退出代码movl $1

27、, %eax # 系统调用号系统调用号(sys_exit)int $0 x80 # 调用内核功能调用内核功能【例例4-4】用用Intel 格式编写一个与例格式编写一个与例1相同相同的简单汇编程序。的简单汇编程序。; hello.asmsection .data ; 数据段声明数据段声明msg db “Hello, world!”, 0 xA ; 要输出的字符串要输出的字符串len equ $ - msg ; 字串长度字串长度 section .text ; 代码段声明代码段声明 global _start ; 指定入口函数指定入口函数_start: ; 在屏幕上显示一个字符串在屏幕上显示一个字

28、符串mov edx, len ; 参数三:字符串长度参数三:字符串长度mov ecx, msg ; 参数二:要显示的字符串参数二:要显示的字符串mov ebx, 1 ; 参数一:文件描述符参数一:文件描述符(stdout)mov eax, 4 ; 系统调用号系统调用号(sys_write)int 0 x80 ; 调用内核功能调用内核功能 ; 退出程序退出程序mov ebx, 0 ; 参数一:退出代码参数一:退出代码mov eax, 1 ; 系统调用号系统调用号(sys_exit)int 0 x80 ; 调用内核功能调用内核功能4.4.3 编译嵌入式编译嵌入式Linux汇编程序汇编程序1、汇编命

29、令、汇编命令rootlocalhost asm # as -o hello.o hello.s2、链接命令、链接命令rootlocalhost asm # ld -s -o hello hello.o3、运行程序、运行程序rootlocalhost asm #./hello4.5嵌入式嵌入式Linux shell编程编程shell是用户与是用户与Linux系统间的接口程序,系统间的接口程序,它允许用户向操作系统输入需要执行的命它允许用户向操作系统输入需要执行的命令。当用户在终端窗口输入命令,系统会令。当用户在终端窗口输入命令,系统会利用解释器解释这些命令从而执行相应的利用解释器解释这些命令从而

30、执行相应的操作。完成这一解释功能的机制就是操作。完成这一解释功能的机制就是shell。shell编程就是把编程就是把shell命令编写成可执行的命令编写成可执行的脚本文件。脚本文件。4.5.1shell语法基础语法基础1、shell脚本文件脚本文件(1)shell脚本文件结构脚本文件结构 shell脚本文件结构格式是固定的,看一脚本文件结构格式是固定的,看一个示例:个示例:#! /bin/bashecho “Hello World ! ” 将文件保存为将文件保存为 hello.sh。 shell脚本文件的第脚本文件的第1行必须以符号行必须以符号“#!”开开头。头。使用使用/bin/bash解释

31、器来解释并执行程解释器来解释并执行程序。序。 (2)编译)编译shell脚本文件脚本文件 编译编译shell脚本文件的命令为:脚本文件的命令为: chmod +x 文件名文件名例如:例如:chmod +x hello.sh(3)执行已经编译过了的)执行已经编译过了的shell脚本文件脚本文件 rootlocalhost shell # ./hello.sh(4)shell脚本文件的注释语句脚本文件的注释语句 以以#开头的语句表示注释。但脚本第一行开头的语句表示注释。但脚本第一行用用“#!”开头的语句不是注释,而是说明开头的语句不是注释,而是说明shell脚本文件的解释器。脚本文件的解释器。2、

32、shell的变量及配置文件的变量及配置文件shell脚本文件的变量共有脚本文件的变量共有3种:用户变量、环境变种:用户变量、环境变量、系统变量。量、系统变量。(1)用户变量)用户变量变量赋值变量赋值 a=hello world (赋值号的两侧不允许有(赋值号的两侧不允许有空格)空格) 获取变量的值获取变量的值 获取变量的值时,要在变量前面添加获取变量的值时,要在变量前面添加“$”符号。符号。例如:例如:echo $a(2)环境变量)环境变量 由关键字由关键字export说明的变量叫做环境变量。说明的变量叫做环境变量。(3)系统变量)系统变量 常用系统变量:常用系统变量: $0 当前程序的名称当

33、前程序的名称$n 当前程序的第当前程序的第n个参数个参数, n = 1, 2, 9$* 当前程序的所有参数当前程序的所有参数(不包括程序本身不包括程序本身)$# 当前程序的参数个数当前程序的参数个数(不包括程序本身不包括程序本身)$ 当前程序的当前程序的PID$! 执行上一个指令的执行上一个指令的PID(好像不行好像不行?)$? 执行上一个指令的返回值执行上一个指令的返回值4.5.2shell的流程控制语句的流程控制语句1、条件语句、条件语句条件条件if语句的格式为:语句的格式为:if (条件表达式)(条件表达式)then #语句块语句块fi2、循环语句、循环语句for (循环变量初值;(循环

34、变量初值; 循环条件表达式;循环条件表达式; 循环变量增量)循环变量增量)do #循环体语句块循环体语句块done4.5.3shell编程示例编程示例【例例4-5】编写显示编写显示20以内能被以内能被3整除整除的数的的数的shell脚本程脚本程序。序。#! /bin/bashfor(i=1; i/dev/nulldd if=/dev/tty bs=1 count=1 2/dev/null stty -raw stty -rawstty echostty echo echo “Press any key to continue .”echo “Press any key to continue

35、.”get_charget_char/dev/null表表示空设备示空设备块大小块大小bs为为 1,数目也为数目也为 1将其保存为将其保存为test2.sh。然后再编译并执行程序。然后再编译并执行程序。rootlocalhost shell # chmod +x test2.shrootlocalhost shell # ./test2.sh Press any key to continue .4.6位运算位运算4.6.1位运算符位运算符 C语言提供了六种位运算符:语言提供了六种位运算符:&(按位与)、(按位与)、|(按位或)、(按位或)、(按位异(按位异或)、(取反)、或)、(取反

36、)、(右(右移)。移)。 1、按位与运算、按位与运算 按位与运算:只有对应的两个二进位均为按位与运算:只有对应的两个二进位均为1时,时,结果位才为结果位才为1 ,否则为,否则为0。参与运算的数以。参与运算的数以补码方式出现。补码方式出现。例如:例如:9 & 5可写成算式如下:可写成算式如下:可见可见 9 & 5 = 1。 按位与运算通常用来对某些位清按位与运算通常用来对某些位清0或保留某些或保留某些位。位。例如把例如把a 的高八位清的高八位清0,保留低八位,可作,保留低八位,可作 a & 0 x00ff 运算(运算(0 x00ff的二进制数为的二进制数为00000000

37、11111111)。)。main()int a=9,b=5,c;c=a&b;printf(a=%d/nb=%d/nc=%d/n,a,b,c); 2、 按位或运算按位或运算 只要对应的二个二进位有一个为只要对应的二个二进位有一个为1时,结果位时,结果位就为就为1。 例如:例如:9|5可写算式如下:可写算式如下:可见可见9|5=13。 main()int a=9,b=5,c;c=a|b;printf(a=%d/nb=%d/nc=%d/n,a,b,c); 3、按位异或运算、按位异或运算 当两对应的二进位相异时,结果为当两对应的二进位相异时,结果为1。 例如例如95 :main()int a=9;a=a15;printf(a=%d/n,a); 4、求反运算、求反运算 其功能是对参与运算的数的各二进位按位求其功能是对参与运算的数的各二进位按位求反。反。例如,例如,9的运算为:的运算为:(00000000000

温馨提示

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

评论

0/150

提交评论