共享庫的編譯及使用

2021-06-15 07:38:52 字數 1410 閱讀 2984

靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大,一般以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,這也是動態庫最重要的特性,不然就叫靜態庫了,可以仔細想想下面這段話 如果將程式鏈結到共享庫,那麼鏈結器就不會把庫中的目標...