android靜態編譯
Ⅰ QT for Android怎樣設置靜態編譯
Qt默認的編譯方式是動態編譯的,但是有時候編寫的程序要發布出去,帶很多動態庫文件是很繁瑣的,此時就需要靜態編譯程序,Qt要實現靜態編譯必須庫文件也是靜態編譯的,可以用這個命令編譯靜態庫:
1.將C:\Qt\2010.05\qt\mkspecs\win32-g++\qmake
Ⅱ Android中靜態庫和共享庫的區別
簡單來講:
靜態庫是在連接階段直接拷貝到代碼中使用的,而共享庫是由載入器載入到內存,在運行時使用的。
編譯出來的靜態庫(這里指jar包)里每個java文件對應的class文件都單獨存在,可以直接導入Eclipse等IDE使用
而編譯出來的共享庫(jar包),內部是Android位元組碼Dex格式的文件,一般無法導入Eclipse等IDE使用。Android.mk中由BUILD_JAVA_LIBRARY指定生成共享BUILD_STATIC_JAVA_LIBRARY指定生成靜態庫。
Ⅲ Android NDK編譯如何強制使用libc++.a的靜態鏈接庫
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如: gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop 其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
Ⅳ 打包android的時候怎麼引入一些靜態庫
方法1 :
人為建立上面的文件夾並將靜態庫拷入;
方法2 :
就是通過編譯配置來做上面的動作。具體如下:
1. 將動態庫的編譯部分和靜態庫的編譯部分分開;
2. 在工作目錄下建立一個lib文件夾(必須是這個名字),將第三方的靜態庫拷貝進去,並且增加一個編譯配置文件Android.mk,具體內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
這個編譯配置文件就是要在obj下生成中間文件,供其他地方使用。
文件列表如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
3. 在工作目錄下建立一個文件夾,並且將生成動態庫的相關文件全部拷貝進去。這里我們起的名字是src,當然也可以起其他名字。Android.mk內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
這里只要直接引入第三方庫就可以了。
文件列表如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
third_lib.h是靜態庫的頭文件,test.cpp很簡單,就是一個函數裡面順序調了一下靜態庫里開放的函數,內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
3. 工作目錄下增加一個編譯配置文件Android.mk,作用就是查找工作目錄下所有的子目錄中的Android.mk來編譯。Android.mk的內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
好,工作都做完了,下面進入工作目錄mm -B 試一下,可以順利編譯成功。
Ⅳ 請教個Android底層c的第三方靜態庫編譯問題
w經濟關系浩信
Ⅵ android的動態載入和靜態載入的區別
兩者區別:
一,靜態庫的使用需要:
1
包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2
設置lib文件允許編譯器去查找已經編譯好的二進制代碼
二,動態庫的使用:
程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫
三,依賴性:
靜態鏈接表示靜態性,在編譯鏈接之後,
lib庫中需要的資源已經在可執行程序中了,
也就是靜態存在,沒有依賴性了
動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供
需要的
動態庫,有依賴性,
運行時候沒有找到庫就不能運行了
四,區別:
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。
做成靜態庫可執行文件本身比較大,但不必附帶動態庫
做成動態庫可執行文件本身比較小,但需要附帶動態庫
五:
首先糾正所謂「靜態連接就是把需要的庫函數放進你的exe之中」的說法。在真實世界中,有三個概念:Use
static
libary,
static
linked
DLL,
dynamic
linked
DLL.
多數人混淆了static
libary
和
static
linked
DLL的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。
使用靜態庫(Use
static
libary)是把.lib和其他.obj一起build在目標文件中,目標文件可以是.exe,也可以是.dll或.oxc等。一般情況下,可以根本就沒有「對應的」.dll
文件,如C
Run
Time(CRT)庫。一個例子就是,寫一個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe文件頭呢?是,即使加上文件頭的尺寸,build出的執行文件仍然「莫名的大」。實際上那多出來的部分就是CRT靜態庫。姑且可以把靜態庫.lib理解成外部程序的obj文件比較合理,它包含了函數的實現。
Ⅶ 為什麼谷歌不把安卓做成方舟編譯器那樣的所謂靜態編譯,而是要採用效率低下的動態編譯呢
呵呵呵呵,無知者無畏啊。問你幾個問題。你為什麼說谷歌的編譯器效率低下呢?你有沒有考慮功能變化和擴展性呢?人家在為軟體的自動進化做准備。你還在原始社會換石錘。
Ⅷ android已有動態庫怎麼編譯靜態庫
在eclipse工程目錄下建立一個jni的文件夾
在jni文件夾中建立Android.mk和Application.mk文件
Android.mk文件:
Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態庫文件等。詳見附件中的Android.mk。
Application.mk文件:
定義了項目的一些細節,比如APP_ABI := x86(編譯X86平台庫)、APP_PLATFORM := android-9(使用android-9以上的平台庫)。
NDK 編譯和使用靜態庫、動態庫
情況一:編譯靜態庫
情況二:編譯動態庫
情況三:編譯動態庫+靜態庫
情況四:已有第三方靜態庫(動態庫),編譯靜態庫(動態庫)
默認所有代碼和文件在$project/jni下,否則特殊說明。
情況一:編譯靜態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_STATIC_LIBRARY)
文件Application.mk:
APP_MODULES :=hello-jni
情況二:編譯動態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
情況三:編譯動態庫+靜態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_static
LOCAL_SRC_FILES := src.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_shared
LOCAL_SRC_FILES := src2.c
LOCAL_STATIC_LIBRARIES := mylib_static
include $(BUILD_SHARED_LIBRARY)
情況四:已有第三方靜態庫(動態庫),編譯靜態庫(動態庫)
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := thirdlib1 # name it whatever
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libthird1.a # or $(so_path)/libthird1.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) #or PREBUILT_SHARED_LIBRARY
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_use_thirdlib
LOCAL_SRC_FILES := src.c
LOCAL_STATIC_LIBRARIES := thirdlib1 #or LOCAL_SHARED_LIBRARY
include $(BUILD_SHARED_LIBRARY) #如果編譯靜態庫,需要Application.mk
用cd命令移至jni目錄,運行/mnt/500G/public/NDK/android-ndk-r7b/ndk-build命令,這時命令行中可能會出現編譯錯誤,比如頭文件找不到,函數找不到等等,細心找找就能改掉。
編譯成功後,在工程目錄下libs/x86中就會生成你想要的.so庫。
Ⅸ Android NDK 把jni要調的方法編譯成靜態庫,再轉動態庫,報找不到對應的函數
用那個PREBUILT_STATIC_LIBRARY 這個來配置編譯好了的靜態庫,而不是傳統的的BUILD_STATIC_LIBRARY!!
Ⅹ 如何在android使用已經有的靜態庫
關於編譯靜態庫:
android.mk和xxx.cpp放在新文件夾里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成靜態庫libx.a文件
關於鏈接靜態庫:
有兩種方法:
1、把libx.a文件放在android.mk同一目錄下,添加:
LOCAL_PREBUILT_LIBS += libx.a
2、同上,添加:
include $(CLEAR_VARS)LOCAL_MODULE := libxLOCAL_SRC_FILES := libx.ainclude $(PREBUILT_STATIC_LIBRARY)LOCAL_STATIC_LIBRARIES += libx
貌似第二種是NDK里比較常見,第一種在其他的android.mk里比較常見。