第 5 章 GNU C開(kāi)發(fā)環(huán)境_第1頁(yè)
第 5 章 GNU C開(kāi)發(fā)環(huán)境_第2頁(yè)
第 5 章 GNU C開(kāi)發(fā)環(huán)境_第3頁(yè)
第 5 章 GNU C開(kāi)發(fā)環(huán)境_第4頁(yè)
第 5 章 GNU C開(kāi)發(fā)環(huán)境_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章GNUC開(kāi)發(fā)環(huán)境內(nèi)容提要GNUC編譯器項(xiàng)目管理工具:GNUmake創(chuàng)建和使用函數(shù)庫(kù)GNUC函數(shù)庫(kù):glibc5.1GNUC編譯器概述GNU計(jì)劃開(kāi)發(fā)了一系列編譯器,他們構(gòu)成GNU編譯器集合GCC。用高級(jí)語(yǔ)言編寫(xiě)的源代碼文件需要依次經(jīng)過(guò)預(yù)處理、編譯和鏈接,最終生成各種目標(biāo)文件,例如,可執(zhí)行文件等。為了提高軟件的開(kāi)發(fā)效率,開(kāi)發(fā)人員引入了一系列工具,例如,調(diào)試器、項(xiàng)目管理和版本控制等軟件。

本章圍繞Linux環(huán)境下的C語(yǔ)言開(kāi)發(fā),對(duì)開(kāi)發(fā)過(guò)程中所涉及的主要工具進(jìn)行介紹。編譯與鏈接LibraryFilesObjectFilesAssemblySourceFilesC/C++SourceandHeaderFilesMakefile工程文件c/c++源文件(*.c/*.cpp)和頭文件(*.h)匯編語(yǔ)言源文件(*.s)鏈接命令文件用戶創(chuàng)建的文件預(yù)處理(cpp)編譯器(gcc/g++)匯編器(as)Make工具目標(biāo)文件(*.o)共享目標(biāo)文件可執(zhí)行文件可鏈接文件鏈接映射文件鏈接器(ld)函數(shù)庫(kù)文件(*.a/*.so)歸檔工具(ar)基本概念1.預(yù)處理預(yù)處理是指處理源代碼文件中以#為行首的指令,例如,宏定義和條件編譯等,將其轉(zhuǎn)換為等價(jià)源文件。2.編譯編譯是指源代碼文件翻譯成機(jī)器指令,內(nèi)容包括詞法分析、語(yǔ)法分析、中間代碼的生成與優(yōu)化?;靖拍?續(xù))3.匯編匯編是指將匯編語(yǔ)言轉(zhuǎn)換為機(jī)器指令的過(guò)程。4.鏈接鏈接是指在鏈接命令文件的控制下,鏈接器將目標(biāo)文件和引用的函數(shù)庫(kù)組合為可執(zhí)行文件的過(guò)程。GCCGCC(GNUCompilerCollection)是GNU下編譯器及其相關(guān)工具的集合。GCC原名為GNUC語(yǔ)言編譯器,因?yàn)樗局荒芴幚鞢語(yǔ)言。隨著GCC的發(fā)展,在功能上得到了不斷擴(kuò)展。目前,支持多種語(yǔ)言,被移植到多種硬件處理器,適用于多種操作系統(tǒng)。gcc命令

gcc(GNUCCompiler)是GNU下C語(yǔ)言編譯器及相關(guān)工具的集成,其中包含了預(yù)處理器、編譯器、匯編器、鏈接器等工具。gcc命令語(yǔ)法gcc[option]list功能編譯/鏈接列表list中的C源文件。gcc命令(續(xù))選項(xiàng)功能描述-Wall打印警告信息-g生成調(diào)試信息-O0-O1-O2(O大寫(xiě))優(yōu)化選項(xiàng),若有多個(gè)則最后一個(gè)有效-I(i大寫(xiě))指定額外頭文件搜索路徑-L指定額外函數(shù)庫(kù)的搜索路徑-D定義宏-l指定引用函數(shù)庫(kù)的名稱-static指定鏈接時(shí)使用靜態(tài)庫(kù)-shared指定鏈接時(shí)使用共享庫(kù)(默認(rèn))-E輸出預(yù)處理后的文件-S(S大寫(xiě))編譯生成的匯編文件(.s)-c編譯并匯編生成的目標(biāo)文件(.o)-o指定輸出文件名-Wl告訴gcc/g++傳送參數(shù)至linker-fpic生成地址無(wú)關(guān)代碼-M-MM生成目標(biāo)依賴關(guān)系,-MM不包含系統(tǒng)頭文件實(shí)例分析//exam5-1.c#include<stdio.h>intcount=20;int

main(void){

intk;

intsum=0;

#ifdefDEBUG

printf("runingindebugmode\n");#else

printf("runinginnodebugmode\n");#endif

for(k=0;k<count;k++)sum=sum+k;

printf("thesumis%d\n",sum);}實(shí)例分析(續(xù))$gcc-E-DDEBUGexam5-1.c-oexam5-1.i //預(yù)處理生成exam5-1.i$gcc-Sexam5-1.i//編譯生成exam5-1.s$gcc-cexam5-1.s//匯編生成exam5-1.o$gccexam5-1.o-oexam5-1//鏈接生成exam5-1$exam5-1//觀察程序運(yùn)行結(jié)果runingindebugmodethesumis: 190將各階段合成一條命令$gcc-DDEBUGexam5-1.c-oexam5-15.2項(xiàng)目管理工具GNUmake內(nèi)容提要GNUmake概述編寫(xiě)GNUmake腳本規(guī)則 變量隱含規(guī)則和模式規(guī)則實(shí)例分析GNUmake概述GNUmake是一種Linux環(huán)境下軟件項(xiàng)目管理工具,通過(guò)編寫(xiě)腳本,以規(guī)則的形式明確目標(biāo)的生成過(guò)程,當(dāng)需生成某個(gè)目標(biāo)時(shí),僅需攜帶目標(biāo)參數(shù)的make命令即可,make便會(huì)根據(jù)腳本中的規(guī)則,以最小代價(jià)自動(dòng)生成目標(biāo)。

GNUmake適用于有一定規(guī)模的軟件項(xiàng)目,實(shí)現(xiàn)目標(biāo)生成的管理,為了增強(qiáng)規(guī)則腳本的表達(dá)能力,GNUmake引入高級(jí)語(yǔ)言的某些語(yǔ)法成分,例如變量和函數(shù)等。存放make執(zhí)行規(guī)則的腳本文件通常默認(rèn)為Makefile或makefile。實(shí)例分析

假設(shè)一小型系統(tǒng)經(jīng)過(guò)分析與設(shè)計(jì),系統(tǒng)按功能被劃分為若干模塊,模塊對(duì)應(yīng)的源文件分別為app.c、main.c、frame.c、component.c和lib.c,最終需生成可執(zhí)行文件app。手工管理$gcc-capp.c

$gcc-cmain.c

$gcc-cframe.c

$gcc-ccomponent.c

$gcc-clib.c

$gcc

app.o

main.o

frame.o

component.o

lib.o-oappshell腳本$catexam.shgcc-capp.c

gcc-cmain.c

gcc-cframe.c

gcc-ccomponent.c

gcc-clib.c

gcc

app.o

main.o

frame.o

component.o

lib.o-oapp規(guī)則

Makefile通常由若干條規(guī)則組成,每條規(guī)則的語(yǔ)法如下。語(yǔ)法目標(biāo):依賴文件<tab>[修飾符]命令1<tab>[修飾符]命令2……<tab>[修飾符]命令n

規(guī)則描述目標(biāo)產(chǎn)生的條件和過(guò)程,它由依賴關(guān)系和動(dòng)作兩部分組成,依賴關(guān)系描述生成目標(biāo)需依賴的對(duì)象,動(dòng)作描述目標(biāo)生成需執(zhí)行的命令。規(guī)則(續(xù))

命令行以<tab>字符開(kāi)始,目標(biāo)由若干以空格分割的文件名或標(biāo)簽組成,通常目標(biāo)僅包含一個(gè)文件名或標(biāo)簽;依賴文件是目標(biāo)生成所依賴的文件,它由若干以空格分割的文件名構(gòu)成;命令前的修飾符為可選項(xiàng),用于對(duì)命令執(zhí)行過(guò)程的修飾。重建目標(biāo)需滿足下列條件之一。(1)目標(biāo)文件不存在。(2)目標(biāo)的修改時(shí)間早于依賴路徑上某文件的修改時(shí)間。依賴文件中的文件通常為另一條規(guī)則的目標(biāo),依賴文件可為空。規(guī)則的執(zhí)行

建立目標(biāo)時(shí),make從規(guī)則推導(dǎo)出產(chǎn)生目標(biāo)的路徑,當(dāng)條件滿足,make以反向遞推方式依次生成依賴的目標(biāo),直至產(chǎn)生最終目標(biāo)。若目標(biāo)的修改時(shí)間晚于所依賴的文件,則對(duì)應(yīng)規(guī)則中的命令不予執(zhí)行,以提高項(xiàng)目管理效率。Makefile文件app:app.o

main.o

frame.o

component.o

lib.o

gcc

app.o

main.o

frame.o

component.o

lib.o-oappapp.o:app.c

gcc-capp.cmain.o:main.c

gcc-cmain.cframe.o:frame.c

gcc-cframe.ccomponent.o:component.c

gcc-ccomponentlib.o:lib.c

gcc-clib.cclean:

rm-rf*.o遞歸生成目標(biāo)appmain.oframe.ocomponent.olib.ogccapp.omain.oframe.ocomponent.olib.o-oappmakeappapp.omain.cframe.ccomponent.clib.capp.cgcc-capp.cgcc-cmain.cgcc-ccomponent.cgcc-clib.cgcc-cframe.cGNUmake的變量

為了提高可擴(kuò)展性,使規(guī)則更簡(jiǎn)潔,make引入變量、函數(shù)和模式等高級(jí)特性;變量可保存文件名列表、命令和參數(shù)。

make支持四種類型的變量,它們分別1.自定義變量2.環(huán)境變量3.預(yù)定義變量4.自動(dòng)變量。自定義變量(1)變量的賦值自定義變量存在多種賦值方式,常見(jiàn)的賦值操作如下表所示。變量賦值操作含義name=string以遞歸展開(kāi)方式為變量name賦值,string中引用的變量在使用時(shí)展開(kāi)name:=string以直接展開(kāi)方式為變量name賦值,string中引用的變量在定義時(shí)展開(kāi)name+=string為變量name添加新值name?=string為未定義的變量name賦值(2)變量的引用$(name)或${name}環(huán)境變量make會(huì)繼承父進(jìn)程Shell的環(huán)境變量,系統(tǒng)中的環(huán)境變量對(duì)make可見(jiàn),此外,用戶可在腳本中使用export/unexport創(chuàng)建/注銷環(huán)境變量,環(huán)境變量的引用方法與自定義變量相同;由于環(huán)境變量的全局性,應(yīng)盡量避免使用,尤其對(duì)于遞歸式make。預(yù)定義變量

為了提高腳本的可讀性和可移植性,make引入了預(yù)定義變量,并為它們?cè)O(shè)置默認(rèn)值,在實(shí)際應(yīng)用時(shí),預(yù)定義變量可被重新賦值,make中常見(jiàn)的預(yù)定義變量如下表所示。預(yù)定義變量名含義默認(rèn)值A(chǔ)R歸檔程序arAS匯編器asCCC語(yǔ)言編譯器ccCXXC++編譯器g++CPP帶有標(biāo)準(zhǔn)輸出的C語(yǔ)言預(yù)處理程序$(CC)–ERM刪除文件的命令rm–rVPATH依賴文件的搜索路徑空自動(dòng)變量

對(duì)于模式規(guī)則,依賴關(guān)系中不指定具體的目標(biāo)和依賴的文件,模式中的對(duì)象只有在規(guī)則解釋時(shí)才能確定。為了滿足這些需求,GNUmake引入了自動(dòng)變量,其定義如下表所示。變量功能描述$^規(guī)則中所有的依賴文件,文件以空格分割,以出現(xiàn)的先后為序$<規(guī)則中的第一個(gè)依賴文件$?所有比目標(biāo)文件更新的依賴文件,文件以空格分割$*目標(biāo)模式中%及其之前的部分$@規(guī)則中的目標(biāo)隱含規(guī)則和模式規(guī)則

對(duì)于規(guī)模較大的軟件,項(xiàng)目管理腳本通常擁有大量的規(guī)則,其中很多規(guī)則具有相似性,為了簡(jiǎn)化設(shè)計(jì),提高腳本的可讀性,make引入了隱含規(guī)則和模式規(guī)則。隱含規(guī)則

隱含規(guī)則亦稱內(nèi)置規(guī)則,為make內(nèi)部的預(yù)定義規(guī)則。在實(shí)際應(yīng)用中,有些規(guī)則頻繁出現(xiàn)且具有相似的行為模式,例如,將后綴.c的C源文件編譯為后綴.o的中間文件等%.o:%.c $(COMPILE.c)$(OUTPUT_OPTION)$<

為了簡(jiǎn)化腳本設(shè)計(jì),make以模式規(guī)則的方式預(yù)先進(jìn)行了定義,用戶無(wú)須在腳本中顯式定義。模式規(guī)則

若規(guī)則的依賴關(guān)系中使用了通配符%,這樣的規(guī)則稱為模式規(guī)則;例如,模式d%.c表示以字母d開(kāi)頭的任意C源文件;通常,隱含規(guī)則屬于模式規(guī)則。Makefile文件objs=app.o

main.o

frame.o

component.o

lib.o

app:$(objs) $(CC)-o$@$^clean:

rm-f*.o

通過(guò)使用變量、隱含規(guī)則和模式規(guī)則,可使腳本的內(nèi)容更簡(jiǎn)潔。5.3創(chuàng)建和使用函數(shù)庫(kù)內(nèi)容提要函數(shù)庫(kù)概述靜態(tài)庫(kù)共享庫(kù)動(dòng)態(tài)鏈接器函數(shù)庫(kù)概述

在軟件開(kāi)發(fā)過(guò)程中,為了提高代碼的可復(fù)用性,對(duì)于可重復(fù)使用的代碼,可將它們組織成函數(shù)庫(kù),以函數(shù)庫(kù)的形式供其他開(kāi)發(fā)人員使用,從而提高軟件的開(kāi)發(fā)效率。函數(shù)庫(kù)是由若干函數(shù)構(gòu)成的集合,由源代碼經(jīng)編譯后歸檔產(chǎn)生,根據(jù)函數(shù)庫(kù)的使用方式,函數(shù)庫(kù)可分為靜態(tài)庫(kù)和共享庫(kù)。通常,同一份代碼會(huì)以靜態(tài)庫(kù)和共享庫(kù)兩種形式供用戶使用,它們?cè)诠δ苌喜o(wú)區(qū)別。函數(shù)庫(kù)的鏈接方式使用靜態(tài)函數(shù)庫(kù)鏈接生成的可執(zhí)行文件使用共享函數(shù)庫(kù)鏈接生成的可執(zhí)行文件靜態(tài)函數(shù)庫(kù)共享函數(shù)庫(kù)靜態(tài)函數(shù)庫(kù)文件命名:libxxx.a共享韓束庫(kù)文件命名:libxxx.so嵌入目標(biāo)對(duì)象動(dòng)態(tài)加載目標(biāo)對(duì)象靜態(tài)庫(kù)

靜態(tài)庫(kù)由若干源代碼經(jīng)編譯器產(chǎn)生的目標(biāo)文件,利用ar工具歸檔而成。靜態(tài)庫(kù)的命名方式為libxxx.a,lib為前綴,xxx為庫(kù)名,.a為后綴。靜態(tài)庫(kù)的特點(diǎn)

使用靜態(tài)庫(kù)鏈接生成的可執(zhí)行文件具有下列特點(diǎn)。(1)運(yùn)行時(shí)無(wú)須靜態(tài)庫(kù)的支持。(2)較高的運(yùn)行速度(3)占用較多內(nèi)存和磁盤空間(4)不易維護(hù)創(chuàng)建和使用靜態(tài)庫(kù)1.創(chuàng)建靜態(tài)庫(kù)將源代碼文件exam5-2.c和exam5-3.c編譯并歸檔為靜態(tài)庫(kù)libdemo.a。$gcc-c-Wallexam5-2.c$gcc-c-Wallexam5-3.c$ar-crulibdemo.aexam5-2.oexam5-3.o2.使用靜態(tài)庫(kù)$gcc-I.exam5-5.c-oexam5-5libdemo.a或$gcc-I.-L.exam5-5.c-oexam5-5-ldemo

共享庫(kù)

共享庫(kù)由若干源代碼文件經(jīng)過(guò)編譯生成地址無(wú)關(guān)的目標(biāo)文件,由鏈接器鏈接而成。由于共享庫(kù)的運(yùn)行地址需在加載時(shí)確定,因此,共享庫(kù)也稱為動(dòng)態(tài)鏈接庫(kù)。共享庫(kù)的命名方式為libxxx.so,lib為前綴,xxx為庫(kù)名,.so為后綴。共享庫(kù)的特點(diǎn)

使用共享庫(kù)鏈接生成的可執(zhí)行程序具有下列特點(diǎn)。(1)占用較少的內(nèi)存和磁盤空間。(2)多個(gè)實(shí)例僅需保留一個(gè)共享對(duì)象的內(nèi)存副本。(3)容易維護(hù)(14)程序運(yùn)行時(shí)需要共享庫(kù)的支持。(5)程序啟動(dòng)速度較慢。創(chuàng)建和使用共享庫(kù)1.創(chuàng)建共享庫(kù)將源代碼文件exam5-2.c和exam5-3.c編譯并鏈接為共享庫(kù)libdemo.so$gcc–c-fpic-Wallexam5-2.c$gcc–c-fpic-Wallexam5-3.c$gcc-shared-olibdemo.soexam5-2.oexam5-3.o2.使用共享庫(kù)$gcc-I.exam5-5.c-oexam5-5libdemo.so或$gcc-I.-L.exam5-5.c-oexam5-5-ldemo

共享庫(kù)別名

為了便于共享庫(kù)的維護(hù),在創(chuàng)建共享庫(kù)時(shí),可為其定義一個(gè)別名,提供一層間接引用,供動(dòng)態(tài)鏈接器使用。為共享庫(kù)創(chuàng)建別名時(shí),需用別名為真實(shí)共享庫(kù)文件創(chuàng)建一個(gè)符號(hào)鏈接。

創(chuàng)建共享庫(kù)別名

為共享庫(kù)libdemo.so.2.3添加別名libdemo.so.2。$gcc-Wall-fpic-sharedexam5-2.cexam5-3.c-olibdemo.so.2.3-Wl,--soname,libdemo.so.2

為別名創(chuàng)建符號(hào)鏈接,共動(dòng)態(tài)哦連接器使用。$ln-slibdemo.so.2.3libdemo.so.2

為便于鏈接,為別名進(jìn)一步創(chuàng)建符號(hào)鏈接,供鏈接時(shí)使用。$ln-slibdemo.so.2libdemo.so

動(dòng)態(tài)鏈接器

對(duì)于使用共享庫(kù)鏈接生成的可執(zhí)行文件,由于共享庫(kù)的運(yùn)行地址尚未確定,因此,在程序加載時(shí)需進(jìn)行重定位,系統(tǒng)通常將該工作交由一個(gè)稱為動(dòng)態(tài)鏈接器的程序完成。它本身也是可執(zhí)行文件,位于/lib/ld-linux.so.X,X為版本號(hào)。共享庫(kù)中對(duì)象的運(yùn)行地址,由動(dòng)態(tài)鏈接器在加載時(shí)確定。共享庫(kù)的搜索

加載共享庫(kù)時(shí),為了使動(dòng)態(tài)鏈接器確定其所在位置,系統(tǒng)需為動(dòng)態(tài)鏈接器設(shè)置搜索路徑,搜索路徑的優(yōu)先級(jí)如下。

(1)若設(shè)置了環(huán)境變量LD_LIBRARY_PATH,裝載器依次搜索其中的目錄。(2)若生成程序時(shí)使用了-rpath選項(xiàng),則查找指定的目錄。(3)檢查/etc/ld.so.cache文件,確認(rèn)其中是否包含所需的共享庫(kù)。(4)檢查/lib和/usr/lib目錄。5.4GNUC函數(shù)庫(kù):glibc內(nèi)容提要glibc概述glibc的體系架構(gòu)glibc函數(shù)的分類glibc函數(shù)的返回值構(gòu)建應(yīng)用程序?qū)嵗治鰃libc概述

glibc(BNUCLibrary)是GNU為L(zhǎng)inux系統(tǒng)設(shè)計(jì),面向C語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù),自誕生至今,處于不斷演化過(guò)程中,其功能日趨完善。

glibc函數(shù)庫(kù)封裝了Linux內(nèi)核的硬件特性,支持ISOC,SVID,POSIX.,BSD,和SUS等多種接口標(biāo)準(zhǔn),使基于glibc開(kāi)發(fā)的應(yīng)用程序,在無(wú)需修改源碼的前提下,可跨越不同的操作系統(tǒng)和硬件平臺(tái),從而提高了應(yīng)用程序的可移植性。

glibc提供了大量可復(fù)用函數(shù),降低了軟件開(kāi)發(fā)成本,提高了軟件開(kāi)發(fā)效率。glibc的安裝路徑頭文件/usr/include//系統(tǒng)頭文件/usr/local/include//本地頭文件函數(shù)庫(kù)/lib:/系統(tǒng)必備共享庫(kù)/usr/lib/標(biāo)準(zhǔn)靜態(tài)庫(kù)和共享庫(kù)/usr/X11R6/lib//X11R6的函數(shù)庫(kù)/usr/local/lib//本地函數(shù)庫(kù)glibc的體系架構(gòu)sys_read()….fork(){...

movl2,%eax

int$0x80...}IDT0x0用戶空間main(){...fork()...}ENTRY(system_call){

SAVE_ALL...

call*SYMBOL_NAME(sys_call_table)(,%eax,4)...

ret_from_sys_call();}

sys_call_table1234

sys_fork(){ ...}內(nèi)核空間應(yīng)用程序sys_write()divide_error()debug()nmi()system_call()0x80glibcsys_fork()sys_exit()glibc函數(shù)的分類核心函數(shù)僅對(duì)內(nèi)核接口進(jìn)行了簡(jiǎn)單封裝,語(yǔ)義未發(fā)生改變,與內(nèi)核接口一一對(duì)應(yīng)。例如,open函數(shù)和execve函數(shù)等庫(kù)函數(shù)庫(kù)函數(shù)可進(jìn)一步分為衍生函數(shù)和輔助函數(shù),衍生函數(shù)在核心函數(shù)的基礎(chǔ)上,對(duì)功能做了進(jìn)一步擴(kuò)展,例如,glibc的標(biāo)準(zhǔn)I/O函數(shù)庫(kù),輔助函數(shù)與內(nèi)核無(wú)關(guān),例如,數(shù)學(xué)函數(shù)和字符串函數(shù)等。glibc函數(shù)的返回值

函數(shù)調(diào)用通常會(huì)有一個(gè)返回值,返回0表示成功,返回-1表

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論