Linux之動態鏈結庫

2021-07-28 08:55:38 字數 2742 閱讀 1961

動態鏈結庫的名字形式為

lib***.so

,字首是

lib,字尾名為「

.so」。

l 針對於實際庫檔案,每個共享庫都有個特殊的名字「

soname

」。在程式啟動後,程式通過這個名字來告訴動態載入器該載入哪個共享庫。

l 在檔案系統中,

soname

僅是乙個鏈結到實際動態庫的鏈結。對於動態庫而言,每個庫實際上都有另乙個名字給編譯器來用。它是乙個指向實際庫映象檔案的鏈結檔案(

lib+soname+.so

)。編寫四則運算動態庫**:

dynamicmath.h

標頭檔案

#pragma once

class dynamicmath;

l 首先,生成目標檔案,此時要加編譯器選項-fpic

g++ -fpic -c dynamicmath.cpp

-fpic

建立與位址無關的編譯程式(

pic,

position independent code

),是為了能夠在多個應用程式間共享。

l 然後,生成動態庫

,此時要加鏈結器選項

-shared

g++ -shared -o libdynmath.so dynamicmath.o

-shared

指定生成動態鏈結庫。

其實上面兩個步驟可以合併為乙個命令:

g++-fpic -shared-o libdynmath.so dynamicmath.cpp

編寫使用動態庫的測試**:

測試**:

#include "../dynamiclibrary/dynamicmath.h"

#include

using namespace std;

int main(int argc, char* argv)

引用動態庫編譯成可執行檔案(跟靜態庫方式一樣):

g++ testdynamiclibrary.cpp -l../dynamiclibrary -ldynmath

然後執行:

./a.out

,發現竟然報錯了!!!

可能大家會猜測,是因為動態庫跟測試程式不是乙個目錄,那我們驗證下是否如此:

發現還是報錯!!!那麼,在執行的時候是如何定位共享庫檔案的呢? 1)

當系統載入可執行**時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑。此時就需要系統動態載入器

(dynamic linker/loader)。2)

對於elf

格式的可執行程式,是由

ld-linux.so*

來完成的,它先後搜尋

elf檔案的

dt_rpath

段—環境變數

ld_library_path

—/etc/ld.so.cache

檔案列表—

/lib/,/usr/lib

目錄找到庫檔案後將其載入記憶體。

如何讓系統能夠找到它: l

如果安裝在

/lib

或者/usr/lib

下,那麼

ld預設能夠找到,無需其他操作。

l 如果安裝在其他目錄,需要將其新增到

/etc/ld.so.cache

檔案中,步驟如下:

n 編輯

/etc/ld.so.conf

檔案,加入庫檔案所在目錄的路徑

n 執行

ldconfig

,該命令會重建

/etc/ld.so.cache

檔案我們將建立的動態庫複製到

/usr/lib

下面,然後執行測試程式。

,提供了下面幾個介面:

l void *dlopen( const char * pathname, int mode )

:函式以指定模式開啟指定的動態連線庫檔案,並返回乙個控制代碼給呼叫程序。

l void*dlsym(void* handle,const char* symbol)

:dlsym

根據動態鏈結庫操作控制代碼

(phandle)

與符號(symbol)

,返回符號對應的位址。使用這個函式不但可以獲取函式位址,也可以獲取變數位址。

l intdlclose(void *handle)

:dlclose

用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時

,才會真正被系統解除安裝。

l const char *dlerror(void)

:當動態鏈結庫操作函式執行失敗時,

dlerror

可以返回出錯資訊,返回值為

null

時表示操作函式執行成功。

linux動態鏈結庫

在做完mini6410移植全攻略後,打算把自己的linux c筆記,貼出來和大家共享,有不對支援希望大家指出,謝謝!在上篇文章中,是對靜態鏈結庫的介紹,其實有了上面的介紹動態鏈結庫的製作就簡單了,這篇來製作動態鏈結庫 建立動態鏈結庫 cpp view plain copy print?gcc sha...

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...