動態鏈結庫的名字形式為
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 ...