靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大,一般以lib***x.a形式存在。
共享庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小,一般以lib***x.so的檔案形式存在。
庫是別人寫好的現有的,成熟的,可以復用的**。實際專案開發中,每個程式都要依賴很多基礎的底層庫,不需要每個程式設計師去重新發明輪子,因此庫的存在意義非同尋常。
共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項。
ldd命令可以檢視乙個可執行程式依賴的共享庫,
例如:
(1)編寫**,包括標頭檔案和原始檔;
(2)將一步中編寫的源**檔案編譯成乙個動態庫:lib***x.so。
下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案:so_test.h,三個.c檔案:test.c(實際專案中一般有更多頭檔案和原始檔,我們稍後將這幾個檔案編譯成乙個動態庫libtest.so),以及乙個測試檔案:test_main.c 。
共享庫標頭檔案:
[cpp] view plaincopyprint?
#include "stdio.h"
void test();
原始檔:test.c:
[cpp] view plaincopyprint?
void mytestfunction()
$ gcc test.c -fpic -shared -olibtest.so
到此為止,大功基本高成,動態鏈結庫已經成功生成了。
前面我介紹了*.so檔案的編譯和生成。
共享庫的使用有2鐘方式:
1)一種是像靜態庫那樣在編譯時進行鏈結。即把動態鏈結庫裡的函式鏈結到我們現有程式。
例如,我們寫了乙個程式,並且要使用到我們編譯生成的libtest.so:
我們在**中要做的,只需要把共享庫標頭檔案包括進來:
main.c:
[cpp] view plaincopyprint?
#include "so_test.h" /*把庫的標頭檔案include進來*/
int main()
func = (int (*)(void))dlsym(dlh, "mytestfunction");/*mytestfunction是在libtest.so裡提供和實現的*/
if (func == null)
func(); /*使用動態共享庫里的函式*/
fclose(dlh);
exit(0);
}複製**
按如下編譯:
對於linux: gcc -o mytest mytest.c ldl
g 編譯共享庫
測試jni時,遇到乙個問題,在mac上執行如下命令編譯c程式,可以正常通過編譯。inc i usr lib jvm jdk1.8.0 20 include i usr lib jvm jdk1.8.0 20 include linux g shared inc jni helloworldimpl....
MNN 靜態庫的編譯及使用
編譯步驟 1 配置 android ndk 環境變數 android ndk 2 cd path to mnn 3 schema generate.sh 4 cd project android 編譯動態庫 armeabi v7a mkdir build 32 cd build 32 build 3...
多層動態庫的編譯及使用
程式設計之路剛剛開始,錯誤難免,希望大家能夠指出。假如生成乙個動態庫a,然後動態庫b的生成又呼叫了動態庫a,那麼凡是呼叫了動態庫b的程式或者庫,需要既鏈結動態庫a也要鏈結動態庫b,這也是動態庫最重要的特性,不然就叫靜態庫了,可以仔細想想下面這段話 如果將程式鏈結到共享庫,那麼鏈結器就不會把庫中的目標...