Linux下動態鏈結庫呼叫

2021-06-26 20:24:57 字數 1504 閱讀 8730

2014-11-01 10:39

3人閱讀收藏

編輯 刪除2013-06-08 20:52:48

|  分類:

整合開發環境相關|舉報

|字型大小訂閱

linux下的靜態鏈結庫,做起來比較容易,只要將目標檔案用ar打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請大家指正。

動態鏈結庫的生成:

**上與寫靜態鏈結庫沒什麼區別,主要是在編譯時,以兩個檔案舉例:

/*mylib.h

*/void

print();

/*mylib.c

*/#include 

<

stdio.h

>

#include 

"mylib.h

"void

print()

編譯方法如下:

gcc -fpic -shared mylib.c -o mylib.so

此時將生成mylib.so動態鏈結庫檔案。

動態鏈結庫在使用時,分為「隱式呼叫」和「顯式呼叫」兩種。

如果是隱式呼叫,則與靜態庫的使用方法差不多,注意需要包含匯出函式的標頭檔案,即mylib.h:

#include 

<

stdio.h

>

#include 

"mylib.h

"int

main()

編譯方法:

gcc -o main main.c -l./ mylib.so

注意要加上動態鏈結庫的搜尋路徑,否則編譯器只會到系統路徑中去尋找。

顯式呼叫的方式,不必包含mylib.h,但是需要增加幾個系統呼叫:

#include 

<

stdio.h

>

#include 

<

dlfcn.h

>

//顯式載入需要用到的標頭檔案

intmain()

void(*

print)() 

=dlsym(pdlhandle, 

"print

"); 

//定位動態鏈結庫中的函式

if( 

!print )

print(); 

//呼叫動態鏈結庫中的函式

dlclose(pdlhandle); 

//系統動態鏈結庫引用數減1

return0;

}

另外cpp的庫在使用這種方式時要用extern 「c」宣告下,

對於cpp,類可以在函式中作為區域性物件呼叫,如果想使用庫中宣告的類,則要以返回值的形式來產生了。

看一下顯式呼叫的編譯方式:

gcc -ldl -o main main.c

注意要新增-ldl選項,以使用顯式呼叫相關的函式呼叫。

Linux下動態鏈結庫和靜態鏈結庫

第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...

呼叫靜態鏈結庫和動態鏈結庫

呼叫靜態鏈結庫 靜態鏈結庫由.h和.lib檔案組成,h檔案在工程中用來宣告,而.lib檔案包含供外界呼叫的函式的原型。vc 6.0中呼叫靜態鏈結庫.lib共3種方法 1.首先使用語句 include lib.h 並將lib.h拷貝到當前工程目錄下 接著對staticlib smp.lib使用語句 p...

Linux下c 通過動態鏈結庫呼叫類

我的程式是乙個類,在網上找了半天,都是c的例子,c 的類封裝成靜態庫倒容易,可是如何封裝成動態庫,在其它程式中呼叫呢?linux下的動態鏈結庫叫so,即shared object,共享物件。一些函式就不說了,網上多的是。把我遇到的問題寫下來吧 提示錯誤 undefined reference to ...