版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2024/11/6淮阴师范学院嵌入式系统课程组嵌入式系统导论第2章嵌入式系统交叉编译环境2024/11/6第2章嵌入式交叉编译环境2.1嵌入式交叉编译环境12.2Linux系统安装22.3Windows和Linux混合开发模式32.4Linux下常用命令42.5GCC编译器52.7Make工具的使用782.6GDB调试器62.8嵌入式交叉编译环境的搭建2024/11/6嵌入式系统中没有足够的硬件资源支持运行开发工具和调试工具,因此嵌入式软件开发采用交叉编译、调试的方式。一般把交叉编译的主机称为宿主机,也就是普通的PC,而把软件实际运行的环境称为目标机。在编译阶段,借助宿主机编译出目标机的可执行代码,在调试阶段,一般应用软件的调试器和被调试的程序运行在同一台计算机上,但在嵌入式软件中,调试器运行在宿主机上,被调试的程序运行在特定的嵌入式系统硬件平台上,他们之间通过串口或以太网口进行交互。2.1嵌入式交叉编译环境简介2024/11/6交叉开发环境:宿主机+调试通道+目标机“在谁的上面编写运行在谁上的程序的问题”2.1嵌入式交叉编译环境简介2024/11/62.2Linux系统安装安装虚拟机VMware在Vmware下进行安装前的配置在VMware下安装Linux系统2024/11/6混合开发模式的必要:由于初学者对Linux系统不是很熟悉,通常会采用Windows下强大的编辑工具,通过共享再在Linux系统下进行编译、调试等工作。(1)Windows下的文本编辑工具(2)VMware虚拟机设置共享(安装虚拟机工具)(3)samba服务(提供windows和Linux下程序的共享)(4)nfs服务(提供Linux和Linux下程序的共享)2.3Windows和Linux混合开发模式2024/11/6(1)VMware虚拟机工具安装2.3Windows和Linux混合开发模式2024/11/6(1)VMware虚拟机工具安装2.3Windows和Linux混合开发模式解压缩文件tarzxvfVMwareTools-5.0.0-13124.tar.gz–C/home安装文件进入解压缩后的文件夹:cdvmware-tools-distrib/安装:./vmware-install.pl2024/11/6(1)VMware虚拟机设置共享-12.3Windows和Linux混合开发模式设置共享2024/11/6(1)VMware虚拟机设置共享-12.3Windows和Linux混合开发模式访问共享在Linux的/mnt/hgfs目录下可以访问windows下共享的文件夹cd/mnt/hgfs2024/11/62.4Linux下常用命令ls:显示当前目录下的所有文件和目录。ls-a:可以看到隐藏的文件,如以.开头的文件。pwd:显示当前目录路径。ps:列举当前TTY下所有进程ps-A:列举所有cd目录名:进入目录mkdir目录名:创建目录rmdir目录名:删除空目录rm-rf目录名:强行删除整个目录内容(无法恢复),其中f表示强制不进行提示,r表示目录递归。man表示帮助命令注:LINUX下的文件和目录是区分大小写的。2024/11/62.4Linux下常用命令压缩备份bzip2:.bz2文件的压缩程序。bunzip2:.bz2文件的解压缩程序。tar:备份文件。tar是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
2024/11/62.4Linux下常用命令解压,.tar.bz2文件:tar-xjf文件名
解压缩:.bin.gz
gzip-d文件名
例:
把abc.tar解压到/myftp,命令是啥?
tarxvfabc.tar-C/myftp
bz2
解压1:bzip2-dFileName.bz2
解压2:bunzip2FileName.bz2
压缩:bzip2-zFileName
.tar.bz2
解压:tarjxvfFileName.tar.bz2
压缩:tarjcvfFileName.tar.bz2DirName
2024/11/62.4Linux下常用命令.bz
解压1:bzip2-dFileName.bz
解压2:bunzip2FileName.bz
压缩:未知
.tar.bz
解压:tarjxvfFileName.tar.bz
压缩:未知
2024/11/62.4Linux下常用命令 .tgz
解压:tarzxvfFileName.tgz
压缩:tarFileName.tgzDirName
.tar.tgz
解压:tarzxvfFileName.tar.tgz
压缩:tarzcvfFileName.tar.tgzFileName
.zip
解压:unzipFileName.zip
压缩:zipFileName.zipDirName
2024/11/62.4Linux下常用命令-文本编辑命令vi(重要)
CommandMode(命令模式)这是执行vi后的缺省模式此时键盘输入当作命令命令有大小写之区分InputMode(插入模式)使用a、i、o、c、r、s
进入插入模式用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上按下ESC键即可回到CommandModeLastMode(末行模式)在
CommandLine按下:即可进入该模式用来进行保存文件、打开文档或环境的设定命令有大小写之分2.4Linux下常用命令-文本编辑命令vi
vi的进入和内容输入进入:
vi文件名输入文件内容(进入输入模式)新增(append)
a从光标所在位置后面开始新增内容
A从光标所在行最后面的地方开始新增内容。插入(insert)
i从光标所在位置前面开始插入内容
I从光标所在行的第一个非空白字符前面开始插入资料。开始(open)
o在光标所在行下新增一行并进入输入模式。
O在光标所在行上新增一行并进入输入模式。
(命令模式)命令模式1、光标的移动
h
左移一个字符
l右移一个字符
j下移一行
k上移一行
w,W
跳至后一个字的开头(W忽略标点)
b,B
跳至前一个字的开头(B忽略标点)
e
移动到后一个字的末尾
^
至本行第一个非空字符
$至行尾
0至行首
H
移动到当前窗口的第一列
M移动到当前窗口的中间列
L
移动到视窗的最后一列
)
光标所在位置到下个句子的第一个字母
(
光标所在位置到该句子的第一个字母
}光标所在位置到该段落的最后一个字母
{
光标所在位置到该段落的第一个字母1、光标的移动(续)nH将光标移到屏幕的第n行
nL将光标移到屏幕的倒数第n行
CTRL-d向下半页
CTRL-f向下一页
CTRL-u向上半页
CTRL-b向上一页
n-减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以上n行
n+加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下n行命令模式2、删除
x
删除光标所在字符
X删除光标前面的字符
s
删除光标所在字符,并进入输入模式S
删除光标所在的行,并进入输入模式
dd删除光标所在的行
D从光标位置开始删除到行尾
d与光标移动命令的组合命令模式3、修改
r
修改光标所在字符,r后接着要修改的字符。如,rc可以用字符“
c”替换光标所指向的当前字符
R
进入替换状态,新增内容会覆盖原先内容,直到按[ESC]回到命令模式下为止
cc
修改光标所在行
C
修改从光标位置到该行末尾的内容
c与光标移动命令的组合命令模式4、复制和移动yy复制当前行到内存缓冲区nyy复制n行内容到内存缓冲区y与光标移动的组合p将缓冲区的内容粘贴到光标的后面P将缓冲区的内容粘贴到光标的前面另:在末行模式下实现移动:n1,n2mn3:把n1到n2行内容搬到第n3行后命令模式5、搜索字符串/pattern移至下一个包含pattern的行?pattern移至上一个包含pattern的行/往下重复查找?往上重复查找n在同一方向重复查找N在相反方向重复查找/pattern/+n移至下一个pattern所在行后的第n行?pattern?-n移至上一个Pattern所在行前的第n行
6、其他
u撤销前一条命令的结果命令模式*.$^[]{}\/包含在查找字符串中,要用转义字符(\)末行模式1、文件的保存和退出:w保存:q退出:w!强制保存:q!强制退出:wq保存退出:wq!强制保存退出末行模式2、字符串的替换
:s/str1/str2/用字符串str2替换行中首次出现的字符串str1:s/str1/str2/g用字符串str2替换行中所有出现的字符串str1:.,$s/str1/str2/g用字符串str2替换正文当前行到末尾所有出现的字符串str1:1,$s/str1/str2/g用字符串str2替换正文中所有出现的字符串str1:g/str1/s//str2/g功能同上末行模式其他::n将光标移到第n行编辑多个文件vifile1file2…:n编辑下一个文件:efilename编辑指定文件2024/11/6gcc(GNUCCompiler)能将C、C++语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。是GNU推出的功能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%~30%。
2.5GCC编译器2024/11/6gcc的执行过程使用gcc由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤∶
1、预处理(也称预编译,Preprocessing)——对头文件(include)、预编译语句(如define等)进行分析[预处理器cpp]2、编译(Compilation)——将预处理后的文件转换成汇编语言,生成文件.s[编译器ccl]3、汇编(Assembly)——由汇编变为目标代码(机器代码),生成.o的文件[汇编器as]4、连接(Linking)——连接目标代码,生成可执行程序[链接器ld]2.5GCC编译器2024/11/6gcc的执行过程(ESc)四个相互关联的步骤∶源文件.c1、.c源文件2、生成.i文件3、生成文件.s4、生成.o的文件5、生成可执行程序31-E-E-S-S-c-c预处理编译汇编链接2.5GCC编译器2024/11/6GNUC的使用基本语法
gcc[options][filenames]说明:在gcc后面可以有多个编译选项,同时进行多个编译操作。当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。2.5GCC编译器2024/11/6gcc选项-o选项你能用-o编译选项来为将产生的可执行文件指定一个文件名来代替a.out。 例:gcc–ocountcount.c-c选项:告诉GCC仅把源代码编译为目标代码,而取消连接的步骤。缺省时GCC建立的目标代码文件有一个.o的扩展名。 例:gcc–ctest2.c-E只运行C预编译器。-S编译选项告诉gcc在为C代码产生了汇编语言文件后停止编译。2.5GCC编译器2024/11/6-includefile功能相当于在代码中使用#include例子用法:gcc-oexampleexample.c-include/usr/include/stdio.h-I
用来指定头文件目录./usr/include目录一般是不用指定的,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上
-Imyinclude参数了,如果不加你会得到一个“xxxx.h:Nosuchfileordirectory”的错误。2.5GCC编译器2024/11/6编译下列代码并运行下列代码#include<stdio.h>intmain(){ doublecounter;doubleresult; doubletemp; for(counter=0;counter<4000.0*4000.0*4000.0/20.0+2030;counter+=(5-3+2+1)/4) { temp=counter/1239; result=counter; } printf("Resultis%lf\n",result); return0;}2.5GCC编译器2024/11/62.5GCC编译器2024/11/6Gdb(GNUdebugger)是GNU开发组织发布的一个强大的Unix/Linux下的程序调试工具。是一个命令行的调试器,但gdb具有比很多图形化调试器更强大的功能。可以调试各种程序,包括C,C++,JAVA,PASCAL等具有远程调试功能-对嵌入式非常有用2.6GDB调试器2024/11/6Gdb主要可以完成下面任务:(1)启动程序,并可以指定某些参数控制程序的运行(2)可让被调试的程序在用户所指定的断点处停住(3)当程序停止时,检查程序的状态(4)动态地改变程序的参数,可以避过bug,继续查找其他的问题2.6GDB调试器2024/11/6gdb<program>
program也就是你的执行文件,一般在当前目录下2.6GDB调试器2024/11/6Gdb的命令可以使用help命令来查看,help命令只是列出gdb的命令种类。可以使用help<class>命令,显示class种类中的所有命令。可以使用help<command>命令,查看command命令的帮助。Gdb中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。在linux下,可以按两次TAB键来补齐命令的全称。Gdb中运行Linux的shell程序,如shell<command>。2.6GDB调试器2024/11/63.3GDB调试器2024/11/6加载要调试的执行文件file<exec>加载要调试的执行程序exec。2.6GDB调试器2024/11/63.3GDB调试器查看源代码list<linenum>显示程序第linenum行的周围的源程序list<function>显示函数名为function的函数周围的源程序list显示当前行后面的源程序list-显示当前行前面的源程序setlistsizen设置一次显示源代码的行数showlistsize查看当前listsize的设置2.6GDB调试器2024/11/6设置断点(BreakPoint)break<function>---进入指定函数时停住。break<linenum>---在指定行号停住2.6GDB调试器2024/11/6清除断点delete[breakpoints][range]删除指定的断点,breakpoints为断点号,range表示断点号的范围(如:2-4)。如果不指定断点号,则表示删除所有的断点。其简写命令为d。比删除更好的一种方法是disable断点,disable了断点,gdb不会删除,当还需要时,enable即可,就好像回收站一样。2.6GDB调试器2024/11/63.3GDB调试器设置观察点观察点一般用来观察某个表达式的值是否变化了。watch<expr>为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住。infowatchpoints列出当前设置的所有观察点2.6GDB调试器2024/11/6恢复程序运行和单步调试run(r)从程序开始运行程序continue(c)恢复程序运行,直到程序结束,或是下一个断点到来。step(s)单步执行,进入调用的函数的内部next(n)单步执行,不会进入调用的函数内部finish(f)如果已进入了某函数,而想退出该函数返回到它的调用函数中
2.6GDB调试器2024/11/6查看运行时数据print</f><express>查看当前程序的运行数据。</f>为格式。2.6GDB调试器退出GDBquitorq退出GDB2024/11/6练习1(1)键入vi,编辑一个新文件gexam.c。其内容如下:#include<stdio.h>main(){inta,i=0;a=0;while(i<10){a=a+2;printf("thevalueofa=%d\n",a);sleep(1);i=i+1;}}2.6GDB调试器2024/11/6练习1(2)保存退出exam.c编译exam.c。使用gcc-oexamoexam.c使用gcc-g-ogexamexam.c比较gexam与examo的大小,因为gexam含有调试信息,所以gexam比examo大。执行gexam与examo执行examo键入./examo。这里./表示当前目录执行gexam键入./gexam。2.6GDB调试器2024/11/6练习1(3)使用gdb调试程序(1)启动gdb程序(gdb)gdb(2)读入调试程序(gdb)filegexam(3)列出相应于正在执行的程序的原文件内容(gdb)list(4)在程序a=0;处设置一个断点
(gdb)break4(注:这里4为程序a=0;所在程序的行号,若自己更改)(5)在程序printf(“thevalueofa=%d\n”,a);处设置一个断点(6)执行该程序(gdb)run(7)查看变量a的值(gdb)printa(8)查看变量a的类型(gdb)whatisa(9)执行下一个源程序行(gdb)next(10)从断点开始继续执行到下一个断点(gdb)continue(11)查看变量a的值(gdb)printa,看看a是否有变化(12)不停地执行(gdb)continue,直到程序结束。(13)退出gdbquit2.6GDB调试器2024/11/6练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正#include<stdio.h>#include<string.h>voidmy_print(char*string){printf("Thestringis%s\n",string);}voidmy_print2(char*string){char*string2;intsize,i;size=strlen(string);string2=(char*)malloc(size+1);for(i=0;i<size;i++)string2[size-i]=string[i];string2[size+1]='\0';printf("Thestringprintedbackwardis%s\n",string2);}
2.6GDB调试器2024/11/6练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正intmain(){charmy_string[]="helloLinux";my_print(my_string);my_print2(my_string);return;}2.6GDB调试器2024/11/63.4make工具的使用Make工具及makefile文件概述Makefile基本知识Makefile应用
1)为单个文件编写makefile2)为多个文件编写makefile3)使用不同目录的文件的makefile的写法2024/11/62.7Make工具及makefile文件概述GNUMake是程序自动维护工具在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入gcc命令进行编译的话,则会非常不方便。因此,人们通常利用make工具来自动完成编译工作。这些工作包括:
1)如果仅修改了某几个源文件,则只重新编译这几个源文件;
2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。2024/11/6Makefile基本知识基本makefile结构Makefile由一系列规则组成,规则格式如下:其中:target-需要由make工具创建的项目,通常是目的文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。prerequisites-要创建的项目依赖于哪些文件。command
-创建每个项目时需要运行的命令。注:命令前面需要敲入tab键,而不是空格!!!target:prerequisites依赖关系<TAB>command命令2024/11/6Make工具及makefile文件概述Make及makefile原理GNUmake的主要工作是读进文本文件makefile。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的过程。有了这些信息,make会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,Make将执行相应的命令,以便更新目的文件。目的文件不一定是最后的可执行文件,它可以是任何一个文件。
2024/11/6Makefile基本知识Makefile实例:#makefile开始myprog
:
foo.o
bar.o
gcc
foo.o
bar.o
-o
myprog
foo.o
:
foo.c
foo.h
bar.h
gcc
-c
foo.c
-o
foo.o
bar.o
:
bar.c
bar.h
gcc
-c
bar.c
-o
bar.o
clean: -rm*.omyprog#makefile结束2024/11/6Makefile基本知识实例说明从上面的例子注意到,第一个字符为#的行为注释行。第一个非注释行指定myprog为目标,并且依赖于foo.o
和bar.o
文件。foo.o
和bar.o文件又各自有自己的依赖规则makefile中一般都有clean规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件使用make工具的执行makefile的命令为:
make或makemakefile)缺省文件名为当前目录下的makefile或Makefile或GNUmakefile,也可以使用命令行参数-f指定文件名:
例如make–ffilename2024/11/6Makefile基本知识实例说明如果没有“-f”参数,在Linux中,GNUmake工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile文件。通过命令行参数中的target,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。如#make
#makeclean2024/11/6Makefile基本知识Makefile变量环境变量: (1)存储文件名列表。 (2)存储可执行文件名。 (3)存储编译器标识。(4)存储参数列表。
比如我们利用makefile变量把上面的makefile文件重写一遍。2024/11/6Makefile基本知识Makefile变量使用环境变量后的makefile实例=======makefile开始======OBJS=foo.obar.oCC=gccCFLAGS=-Wall–O–gEXEC=myprog$(EXEC):$(OBJS) $(CC)$(OBJS)–o$(EXEC)foo.o:foo.cfoo.hbar.h $(CC)$(CFLAGS)–cfoo.c–ofoo.obar.o:bar.cbar.h $(CC)$(CFLAGS)bar.c–obar.o========makefile结束=======2024/11/6Makefile基本知识Makefile变量内部变量:$@---扩展成当前规则的目的文件名$<---扩展成依靠列表中的第一个依靠文件$^---扩展成整个依靠的列表利用这些变量,可以把上面的makefile写成:2024/11/6Makefile基本知识Makefile变量=====makefile开始======OBJS=foo.obar.oCC=gccCFLAG=-Wall–O–gmyprog:$(OBJS) $(CC)$^-o$@foo.o:foo.cfoo.hbar.h $(CC)$(CFLAG)–c$<-o$@bar.o:bar.cbar.h $(CC)$(CFLAG)–c$<-o$@======makefile结束=======2024/11/6Makefile应用为单个文件编写makefile为多个文件编写makefile使用不同目录的文件的makefile的写法多个子模块的文件的makefile写法2024/11/6Makefile应用为单个文件编写makefile编写hello.c程序#include<stdio.h>intmain(void){printf("Helloworld!\n");return0;}2024/11/6Makefile应用执行:$viMakefile=====makefile开始======#ThisisasampleCC=gccall:hello.o $(CC)–ohellohello.ohello.o:hello.c $(CC)–c–ohello.ohello.cclean: rm*.ohello======makefile结束=======2024/11/6Makefile应用为多个文件编写makefile有四个文件menu.c,music.c,picture.c,menu.h/****************menu.c************************/#include<stdio.h>#include“menu.h”intmain(void){ intchoice;printf("----welcomeyou!-----\n");printf("***1music!***\n");printf("***2picture!***\n");printf("----haveachoice!-----\n");scanf("%d",&choice);
switch(choice) { case1: music(); break; case2: picture(); break; } printf("GoodBye!\n");return0;}2024/11/6Makefile应用为多个文件编写makefile/****************music.c****************/#include<stdio.h>
#include<stdio.h>voidmusic(void){printf("Listentomusic!\n");}2024/11/6Makefile应用为多个文件编写makefile/****************picture.c****************/
#include<stdio.h>voidpicture(void){printf("Havealookatpicture!\n");}2024/11/6Makefile应用为多个文件编写makefile/****************menu.h****************/
voidmusic(void);voidpicture(void);2024/11/6Makefile应用为多个文件编写makefile几个文件间的依赖关系menumusic.omenu.opicture.omenu.hpicture.cmenu.cmusic.c2024/11/6Makefile应用上面程序的makefile:=====makefile开始======CC=gccall:menu.omusic.opicture.o $(CC)menu.omusic.opicture.o-omenumenu.o:menu.cmenu.h $(CC)-cmenu.c-omenu.omusic.o:music.c $(CC)-cmusic.c-omusic.opicture.o:picture.c $(CC)-cpicture.c-opicture.oclean: rm*.omenu======makefile结束=======2024/11/6Makefile应用上面程序的makefile:实际上,可以用$@代表目标文件,$<代表源文件,于是可以将makefile写成这样:=====makefile开始======CC=gccall:menu.omusic.opicture.o $(CC)$^-omenumenu.o:menu.cmenu.h $(CC)-c$<-o$@music.o:music.c $(CC)-c$<-o$@picture.o:picture.c $(CC)-c$<-o$@clean: rm*.omenu======makefile结束=======2024/11/6Makefile应用上面程序的makefile:由于各个文件的编译命令几乎没有什么差别,可以使用通配符%或*进一步简化
:=====makefile开始======CC=gccall:menu.omusic.opicture.o $(CC)$^-omenu%.o:%.c $(CC)-c-o$@$<clean: rm*.omenu======makefile结束=======2024/11/6Makefile应用使用不同目录的文件的makefile的写法假设程序的目录结构如下:---bin存放生成的可执行文件(menu)---obj存放.o文件(menu.o,music.o,picture.o)---include存放.h文件(menu.h)---s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纸制蛋糕顶饰商业机会挖掘与战略布局策略研究报告
- 裘皮外套细分市场深度研究报告
- 河南省开封市金科新未来2024-2025学年高三上学期10月联考数学试题 含解析
- 人流控制栅栏出租行业营销策略方案
- 制罐头用非电压力锅产业链招商引资的调研报告
- 写字台产品供应链分析
- 美容乳液市场发展前景分析及供需格局研究预测报告
- 球棒市场发展前景分析及供需格局研究预测报告
- 电动碾磨机产品供应链分析
- 不间断电源产品供应链分析
- 高考热点作文素材:《黑神话:悟空》
- 2023-2024学年北京市朝阳区陈经纶中学七年级(上)期中数学试卷【含解析】
- 财政投资评审咨询服务预算和结算评审项目 投标方案(技术方案)
- 高中化学必修一《2.2 氯及其化合物》导学案
- DL-T5024-2020电力工程地基处理技术规程
- 广西小学生诗词大赛备考试题库400题(一二年级适用)
- 中国老年2型糖尿病防治指南(2022年版)
- 驾照体检表完整版本
- 天津市河东区2023-2024九年级上学期期中数学试题
- 扬尘治理公示牌
- GB/T 15530.6-2008铜管折边和铜合金对焊环松套钢法兰
评论
0/150
提交评论