Android和Applicationmk詳解_第1頁
Android和Applicationmk詳解_第2頁
Android和Applicationmk詳解_第3頁
Android和Applicationmk詳解_第4頁
Android和Applicationmk詳解_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Android.mk 詳解LOCAL_PATH$(call my-dir) 的作用必須位于 Android.mk 文件的最開始。它是用來定位源文件的位置, 就是返回當(dāng)前目錄的路徑。Android.mk 定義 屬性 方法Android.mk 文件是 GNU Makefile 的一小部分,它用來對 Android 程序進(jìn)行編譯。因為所有的編譯文件都在同一個 GNU MAKE 執(zhí)行環(huán)境中進(jìn)行執(zhí)行,而 Android.mk 中所 有的變量都是全局的。 因此, 您應(yīng)盡量少聲明變量, 不要認(rèn)為某些變量在解析過程中不會被 定義。一個 Android.mk 文件可以編譯多個模塊,每個模塊屬下列類型之一:1 )

2、 APK 程序一般的 Android 程序,編譯打包生成 apk 文件2 ) JAVA 庫java 類庫,編譯打包生成 jar 文件3)CC+ 應(yīng)用程序可執(zhí)行的 CC+ 應(yīng)用程序4 )CC+ 靜態(tài)庫編譯生成 CC+ 靜態(tài)庫,并打包成 .a 文件5 )CC+ 共享庫編譯生成共享庫 (動態(tài)鏈接庫) ,并打包成 .so 文, 有且只有共享庫才能被安裝 / 復(fù)制到您的 應(yīng)用軟件( APK )包中。可以在每一個 Android.mk file 中定義一個或多個模塊,你也可以在幾個模塊中使用同 一個源代碼文件。編譯系統(tǒng)為你處理許多細(xì)節(jié)問題。例如,你不需要在你的Android.mk 中列出頭文件和依NDK

3、后,你應(yīng)該賴文件。編譯系統(tǒng)將會為你自動處理這些問題。這也意味著,在升級得到新的 toolchain/platform 支持,而且不需要改變你的 Android.mk 文件。注意, NDK 的 Anroid.mk 語法同公開發(fā)布的 Android 平臺開源代碼的 Anroid.mk 語法 很接近,然而編譯系統(tǒng)實現(xiàn)他們的方式卻是不同的,這是故意這樣設(shè)計的,可以讓程序開發(fā)人員重用外部庫的源代碼更容易。在描述語法細(xì)節(jié)之前,咱們來看一個簡單的 hello world 的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Androi

4、d.mkhelloworld.c 是一個 JNI 共享庫,實現(xiàn)返回 hello world 字符串的原生方法。相應(yīng)的Android.mk 文件會象下面這樣:CLEAR_VARS 由編譯系統(tǒng)提供 ( 可以在 android 安裝目錄下的 /build/core/config.mkLOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE:= helloworldLOCAL_SRC_FILES := helloworld.c include $(BUILD_SHARED_LIBRARY)解釋一下幾行代碼:LOCAL_PATH :=

5、$(call my-dir)一個 Android.mk file 首先 必須定義好LOCAL_PATH 變量。它表示是當(dāng)前文件的路徑 。在這個例子中,宏函數(shù) my-dir ,由編譯系統(tǒng)提供,用于返回當(dāng)前路徑 (即包含Android.mk file文件的目錄 )。include $(CLEAR_VARS)文件看到其定義,為 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk) ,指定讓 GNUMAKEFILE 該 腳 本 為 你 清 除 許 多 LOCAL_XXX 變 量 ( 例 如 LOCAL_MODULELOCAL_SRC_FILES , LOCAL_STAT

6、IC_LIBRARIES,等等),除 LOCAL_PATH。這是必要的,因為所有的編譯文件都在同一個 GNU MAKE 執(zhí)行環(huán)境中,所有的變量都是全局的。所以我們需要先清空這些變量( LOCAL_PATH 除外)。又因為 LOCAL_PATH 總是要求在每 個模塊中都要進(jìn)行設(shè)置,所以并需要清空它。另外注意,該語句的意思就是把 CLEAR_VARS 變量所指向的腳本文件包含進(jìn)來。LOCAL_MODULE := helloworldLOCAL_MODULE 變量必須定義 , 以標(biāo)識你在 Android.mk 文件中描述的每個模塊 。名稱必須是唯一的, 而且不包含任何空格。 注意編譯系統(tǒng)會自動產(chǎn)生合

7、適的前綴和后綴, 句話說,一個被命名為 foo 的共享庫模塊,將會生成 libfoo.so 文件。注意:如果把庫命名為 libhelloworld ,編譯系統(tǒng)將不會添加任何的 lib 前綴,也會生成libhelloworld.so 。LOCAL_SRC_FILES := helloworld.cLOCAL_SRC_FILES 變量必須包含將要編譯打包進(jìn)模塊中的C 或 C+ 源代碼文件 。不在這里列出頭文件和包含文件,編譯系統(tǒng)將會自動找出依賴型的文件,當(dāng)然對于包含文件,你包含時指定的路徑應(yīng)該正確。注意,默認(rèn)的 C+ 源碼文件的擴展名是 .cpp 。指定一個不同的擴展名也是可能的,只要定義 LOC

8、AL_DEFAULT_CPP_EXTENSION,不要忘記開始的小圓點 (也就是定義為 .cxx ,而不是 cxx )include $(BUILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY 是編譯系統(tǒng)提供的變量,指向一個 GNU Makefile 腳本 ( 應(yīng)就是在 build/core 目錄下的 shared_library.mk),將根據(jù) LOCAL_XXX 系列變量中的值,來編譯生成共享庫( 動態(tài)鏈接庫 )。如果想生成靜態(tài)庫,則用 BUILD_STATIC_LIBRARY在 NDK 的 sources/samples 目錄下有更復(fù)雜一點的例子, 寫有注釋的

9、 Android.mk 文件。二、自定義變量以下是在 Android.mk 中依賴或定義的變量列表, 可以定義其他變量為自己使用,但是NDK 編譯系統(tǒng)保留下列變量名:-以LOCAL開頭的名字(例如 LOCAL_MODULE )-以PRIVATE_, NDK_ 或APP_開頭的名字(內(nèi)部使用)- 小寫名字(內(nèi)部使用,例如 my-dir )如果為了方便在 An droid.mk中定義自己的變量,建議使用MY_前綴,一個小例子:MY_SOURCES := foo.c ifneq ($(MY_CONFIG_BAR),)MY_SOURCES += bar.c endifLOCAL_SRC_FILES +

10、= $(MY_SOURCES)注意::= 是賦值的意思 ;+= 是追加的意思 ; $表示引用某變量的值 。三、 GNU Make 系統(tǒng)變量這些 GNU Make 變量在你的 Android.mk 文件解析之前,就由編譯系統(tǒng)定義好了。注 意在某些情況下, NDK 可能分析 Android.mk 幾次,每一次某些變量的定義會有不同。LOCAL_XXX 變量都在1) CLEAR_VARS: 指向一個編譯腳本,幾乎所有未定義的Module-description 節(jié) 中 列 出 。必須在開始一個新模塊之前包含這個腳本:include$(CLEAR_VARS) ,用于重置除LOCAL_PATH 變量外的

11、,所有 LOCAL_XXX 系列變量。2)BUILD_SHARED_LIBRARY:指向編譯腳本,根據(jù)所有的在LOCAL_XXX 變量把列出的源代碼文件編譯成一個共享庫。注意,必須至少在包含這個文件之前定義LOCAL_MODULE 和LOCAL_SRC_FILES 。變量用于編譯一個靜3 ) BUILD_STATIC_LIBRARY: 一個 BUILD_SHARED_LIBRARY態(tài)庫。靜態(tài)庫不會復(fù)制到的 APK 包中,但是能夠用于編譯共享庫。示例: include $(BUILD_STATIC_LIBRARY)注意,這將會生成一個名為 lib$(LOCAL_MODULE).a 的文件4) T

12、ARGET_ARCH: 目標(biāo) CPU 平臺的名字 , 和 android 開放源碼中指定的那樣。 如 果是arm ,表示要生成 ARM 兼容的指令,與 CPU 架構(gòu)的修訂版無關(guān)。5) TARGET_PLATFORM: Android.mk解析的時候,目標(biāo) Android 平臺的名字 .詳情可參考 /development/ndk/docs/stable- apis.txt.android-3 - Official Android 1.5 system imagesandroid-4 - Official Android 1.6 system imagesandroid-5 - Official

13、 Android 2.0 system images在的版本中一般把這兩個值簡單的定義為6) TARGET_ARCH_ABI: 暫時只支持兩個 value , armeabi 和 armeabi-v7a 。在現(xiàn)arm , 通過 android 平臺內(nèi)部對它重定義來獲得更好的匹配。其他的 ABI 將在以后的 NDK 版本中介紹,它們會有不同的名字。注意但是會有不同雖然所有基于ARM 的 ABI 都 會 把 TARGET_ARCH 定 義 成 armTARGET_ARCH_ABI 。7 ) TARGET_ABI: 目 標(biāo) 平 臺 和ABI 的 組 合 , 它 事 實 上 被 定 義$(TARGET

14、_PLATFORM)-$(TARGET_ARCH_ABI),在想要在真實的設(shè)備中針對一個特別的目標(biāo)系統(tǒng)進(jìn)行測試時,會有用。在默認(rèn)的情況下,它會是android-3-arm 。五、模塊描述變量面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在include $(CLEAR_VARS)$(CLEAR_VARS) 是一個腳本,清include $(BUILD_XXXXX) 之間。正如前面描寫的那樣, 除所有這些變量。1) LOCAL_PATH: 這個變量用于給出當(dāng)前文件的路徑。 必須在 Android.mk 的開頭這個變量不會被 $(CLEAR_VARS)定義,可以這樣使用: LOCAL_PATH :

15、= $(call my-dir)清除,因此每個 Android.mk 只需要定義一次 (即使在一個文件中定義了幾個模塊的情況下)。2) LOCAL_MODULE: 這是模塊的名字,它必須是唯一的,而且不能包含空格。必須在包含任一的 $(BUILD_XXXX) 腳本之前定義它。模塊的名字決定了生成文件的名字。例如,如果一個一個共享庫模塊的名字是, 那么生成文件的名字就是lib.so 。但是, 在的 NDK 生 成文件中 ( 或者 Android.mk 或者 Application.mk) ,應(yīng)該只涉及 (引用 ) 有正常名字的其他模 塊。3) LOCAL_SRC_FILES: 這是要編譯的源代碼

16、文件列表。只要列出要傳遞給編譯器的LOCAL_PATH 的,你文件,因為編譯系統(tǒng)自動計算依賴。注意源代碼文件名稱都是相對于 可以使用路徑部分,例如:LOCAL_SRC_FILES := foo.c toto/bar.cHello.c文件之間可以用空格或 Tab 鍵進(jìn)行分割 ,換行請用 . 如果是追加源代碼文件的話,請用LOCAL_SRC_FILES +=注意:在生成文件中都要使用 UNIX 風(fēng)格的斜杠 (/).windows 風(fēng)格的反斜杠不會被正確的處 理。這種形式來包含 local_path注意:可以 LOCAL_SRC_FILES := $(call all-subdir-java-fil

17、es)目錄下的所有 java 文件。4) LOCAL_CPP_EXTENSION: 這是一個可選變量, 用來指定 C+ 代碼文件的擴展 名,默認(rèn)是 .cpp, 但是可以改變它,比如:LOCAL_CPP_EXTENSION := .cxx5) LOCAL_C_INCLUDES: 可選變量, 表示頭文件的搜索路徑。 默認(rèn)的頭文件的搜索 路徑是 LOCAL_PATH 目錄。示 例 :LOCAL_C_INCLUDESsources/foo 或 LOCAL_C_INCLUDES$(LOCAL_PATH)/./fooLOCAL_C_INCLUDES 需要在任何包含 LOCAL_CFLAGS/LOCAL_C

18、PPFLAGS 標(biāo)志之前進(jìn) 行設(shè)置。注 意 : 不 要 在 Android.mk 中 改 變optimization/debugging級別,只要在6) LOCAL_CFLAGS: 可選的編譯器選項, 在編譯 C 代碼文件的時候使用。這可能是用的,指定一個附加的包含路徑 (相對于 NDK的頂層目錄 ),宏定義,或者編譯選項。Application.mk 中指定合適的信息,就會自動地為你處理這個問題,在調(diào)試期間,會讓NDK 自動生成有用的數(shù)據(jù)文件。7)LOCAL_CXXFLAGS: 與 LOCAL_CFLAGS 同理,針對 C+ 源文件。8)LOCAL_CPPFLAGS: 與 LOCAL_CFL

19、AGS 同理,但是對 C 和 C+ source files都適用。9)LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態(tài)庫,以便在編譯時進(jìn)行鏈接。10 )LOCAL_SHARED_LIBRARIES: 表示模塊在運行時要依賴的共享庫(動態(tài)庫) ,在鏈接時就需要, 以便在生成文件時嵌入其相應(yīng)的信息。 注意: 它不會附加列出的模塊到編譯圖,也就是仍然需要在 Application.mk 中把它們添加到程序要求的模塊中。11 )LOCAL_LDLIBS: 編譯模塊時要使用的附加的鏈接器選項。這對于使用 -l 前綴傳遞指定庫的名字是有用的。例如 , LOCAL_LDLIBS-

20、lz 表示告訴 鏈接器 生成的 模塊 要在加 載時刻 鏈接 到/system/lib/libz.so可查看 docs/STABLE-APIS.TXT 獲取使用 NDK 發(fā)行版能鏈接到的開放的系統(tǒng)庫列表。在 Android.mk 文 件 中還 可 以 用 LOCAL_MODULE_PATH 和庫時, 任何未定義的引用將導(dǎo)致一個 “未定義的符號”錯誤。 這對于在源代碼文件中捕捉錯 誤會有很大的幫助。然而,如果因為某些原因,需要不啟動這項檢查,可把這個變量設(shè)為true 。注意相應(yīng)的共享庫可能在運行時加載失敗。(這個一般盡量不要去設(shè)為true) 。13 ) LOCAL_ARM_MODE: 默認(rèn)情況下,

21、 arm 目標(biāo)二進(jìn)制會以thumb的形式生成(16 位 ),你可以通過設(shè)置這個變量為arm 如果你希望你的 module是以 32位指令的形式。arm (32-bit instructions) mode. E.g.:LOCAL_ARM_MODE := arm注意:可以在編譯的時候告訴系統(tǒng)針對某個源碼文件進(jìn)行特定的類型的編譯比如, LOCAL_SRC_FILES := foo.c bar.c.arm這樣就告訴系統(tǒng)總是將bar.c以 arm 的模式編譯。(14)LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATHLOCAL_UNSTRIPPED_PATH 指定最后的

22、目標(biāo)安裝路徑不同的文件系統(tǒng)路徑用以下的宏進(jìn)行選擇:TARGET_ROOT_OUT :表示根文件系統(tǒng)。TARGET_OUT :表示 system 文件系統(tǒng)。TARGET_OUT_DATA :表示 data 文件系統(tǒng)。用法如: LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)至于 LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH 的區(qū)別,暫時還不清楚。七、 GNU Make功能宏GNU Make 功能宏,必須通過使用 $(call )來調(diào)用,調(diào)用他們將返回文本化的信息。1 ) my-dir: 返回當(dāng)前 Android.mk 所在的目錄的

23、路徑,相對于 NDK 編譯系統(tǒng)的頂層。這是有用的,在 Android.mk 文件的開頭如此定義:注意,在默認(rèn)情況下,NDK 將會只搜索在sources/*/Android.mk中的文件。LOCAL_PATH := $(call my-dir)2 ) all-subdir-makefiles:返回一個位于當(dāng)前my-dir路徑的子目錄中的所有Android.mk 的列表。例如,看下面的目錄層次:sources/foo/Android.mk sources/foo/lib1/Android.mk sources/foo/lib2/Android.mk包含一行:如果 sources/foo/Andro

24、id.mkinclude $(call all-subdir-makefiles) sources/foo/lib2/Android.mk那么它會自動包含sources/foo/lib1/Android.mk這項功能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。3 ) this-makefile:返回當(dāng)前 Makefile的路徑 (即這個函數(shù)調(diào)用的地方4 ) parent-makefile:返回調(diào)用樹中父Makefile 路徑。即包含當(dāng)前Makefile 的的路徑Makefile 路徑。5 ) grand-parent-makefile:返回調(diào)用樹中父 Makefile 的父 Makefile八

25、、 Android.mk 使用模板在一個 Android.mk 中可以生成多個 APK 應(yīng)用程序, JAVA 庫, cc+ 可執(zhí)行程 序,cc+動態(tài)庫和 cc+靜態(tài)庫。1 )編譯 APK 應(yīng)用程序模板。關(guān)于編譯 APK 應(yīng)用程序的模板請參照 Android.mk 編譯 APK 范例2 )編譯 JAVA 庫模板LOcAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)#

26、 Any libraries that this library depends onLOCAL_JAVA_LIBRARIES := android.test.runner# The name of the jar file to createLOCAL_MODULE := sample# Build a static jar file.include $(BUILD_STATIC_JAVA_LIBRARY)表示生成的 JAVA 庫的 jar 文件名注: LOCAL_JAVA_LIBRARIES := android.test.runner3 )編譯 C/C+ 應(yīng)用程序模板如下:LOCAL_P

27、ATH := $(call my-dir)#include $(CLEAR_VARS)LOCAL_SRC_FILES := main.cLOCAL_MODULE := test_exe#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE)注: := 是賦值的意思, += 是追加的意思, $表示引用某變量的值LOCAL_STATIC_LIBRARIES 加入所需要鏈接的靜態(tài)庫 (*.a) 的名稱,LOCAL_SHARED_LIBRARIES 中加入所需

28、要鏈接的動態(tài)庫 (*.so) 的名稱,LOCAL_MODULE 表示模塊最終的名稱, BUILD_EXECUTABLE 表示以一個可執(zhí)行程序的 方式進(jìn)行編譯。4 )編譯 CC+ 靜態(tài)庫LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_SRC_FILES := helloworld.cLOCAL_MODULE:= libtest_static#LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY)和上面相似, BUILD_STATIC_LIBRARY 表示編譯一個靜態(tài)庫。5

29、)編譯 CC+ 動態(tài)庫的模板LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_SRC_FILES := helloworld.cLOCAL_MODULE := libtest_sharedTARGET_PRELINK_MODULES := false#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY)和上面相似, BUILD_SHARED_LIBRARY 表示編譯一個共享庫。以上

30、三者的生成結(jié)果分別在如下目錄中,generic 依具體 target 會變:out/target/product/generic/obj/APPSout/target/product/generic/obj/JAVA_LIBRARIESout/target/product/generic/obj/EXECUTABLEout/target/product/generic/obj/STATIC_LIBRARYout/target/product/generic/obj/SHARED_LIBRARY1) APK 程序: XXX_intermediates每個模塊的目標(biāo)文件夾分別為:2) JAVA 庫

31、程序: XXX_intermediates這里的 XXX3)CC+可執(zhí)行程序: XXX_intermediates4)CC+靜態(tài)庫: XXX_static_intermediates5)CC+動態(tài)庫: XXX_shared_intermediatesApplication.mk 文件簡介:要將 CC+ 代碼編譯為 SO 文件,光有 Android.mk 文件還不行,還需要一個Application.mk 文件。本文檔是描述你的 Android 應(yīng)用程序中需要的本地模塊的 Application.mk 的語 法使用,要明白如下。Application.mk 目的是描述在你的應(yīng)用程序中所需要的模塊

32、 (即靜態(tài)庫或動態(tài)Application.mk 文件通常被放置在 $PROJECT/jni/Application.mk 下,$PROJECT 指的是您的項目。另一種方法是將其放在頂層的子目錄下:$NDK/apps 目錄下,例如:$NDK/apps/Application.mk 是一個簡稱,用于描述你的 NDK 編譯系統(tǒng)的應(yīng)用程序(這個名字不 會生成共享庫或者最終的包)面是 Application.mk 中定義的幾個變量。APP_PROJECT_PATH這個變量是強制性的, 并且會給出應(yīng)用程序工程的根目錄的一個絕對路徑。 這是 用來復(fù)制或者安裝一個沒有任何版本限制的 JNI 庫,從而給 APK

33、 生成工具一個 詳細(xì)的路徑。APP_MODULES這個變量是可選的,如果沒有定義, NDK 將由在 Android.mk 中聲明的默認(rèn)的 模塊編譯,并且包含所有的子文件( makefile 文件) 如果 APP_MODULES 定義了,它不許是一個空格分隔的模塊列表,這個模塊名 字被定義在 Android.mk 文件中的 LOCAL_MODULE 中。注意 NDK 會自動計 算模塊的依賴 注意: NDK 在 R4 開始改變了這個變量的行為,再次之前:- 在您的 Application.mk 中,該變量是強制的- 必須明確列出所有需要的模塊APP_OPTIM這個變量是可選的,用來定義“ rele

34、ase ”或 debug 。在編譯您的應(yīng)用程序模 塊的時候,可以用來改變優(yōu)先級。release ”模式是默認(rèn)的,并且會生成高度優(yōu)化的二進(jìn)制代碼。 debug 模式生成的是未優(yōu)化的二進(jìn)制代碼,但可以檢測出很多的BUG,可以用于調(diào)試。注意:如果你的應(yīng)用程序是可調(diào)試的(即,如果你的清單文件中設(shè)置了android:debuggable 的屬性是true)。默認(rèn)的是debug而不是release。這可以通過設(shè)置APP_OPTIM為release來將其覆蓋。注意:可以在release和debug模式下一起調(diào)試,但是release模式編譯后 將會提供更少的 BUG 信息。在我們清楚 BUG 的過程中,有一些變量被優(yōu)化了, 或者根本就無法被檢測出來,代碼的重新排序會讓這些帶阿彌變得更加難以閱 讀,并且讓這些軌跡更加不可靠。APP_CFLAGS當(dāng)編譯模塊中有任何C文件或者C+文件的時候,C編譯器的信號就會被發(fā)出。這里可以在你的應(yīng)用中需要這些模塊時, 進(jìn)行編譯的調(diào)整, 這樣就不許要直接更 改 Android.mk 為文件本身了重要警告:+ 在這些編制中,所有的路徑都需要于最頂層的 NDK 目錄相對應(yīng)。+ 例如,如果您有以下設(shè)置:+sources/foo/Android.mk +sources/bar/ Android.mk + 編譯過程中,若要在 foo/Android.mk 中指定你要添加的路

溫馨提示

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

評論

0/150

提交評論