小白學Linux之動態庫的建立和使用

2021-08-26 11:03:38 字數 1858 閱讀 9161

1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。

2.動態鏈結庫的名稱有別名(soname), 真名(realname)和鏈結名(linker name)。別名由乙個字首lib,然後是庫的名字,再加上乙個字尾「.so」構成。真名是動態鏈結庫真實名稱,一般總是在別名的基礎加上乙個小版本號,發布版本等構成。除此之外,還有乙個鏈結名,即程式鏈結時使用的庫的名字。

3.在動態鏈結庫安裝的時候,總是複製檔案到某個目錄下,然後用乙個軟連線生成別名,在庫檔案進行更新的時候,僅僅更新軟鏈結即可。

1.看乙個例項來了解如何自己生成靜態庫和使用靜態庫

建立程式檔案

1>在test資料夾下有三個檔案: main.c ,add.c,sub.c,tiger.h

2> main.c檔案中的內容:

#include

#include」tiger.h」

int main(void)

3>.tiger.h檔案中的內容:

#ifndef__tiger__

#define__tiger__

intadd(int a,int b);

intsub(int a,int b);

#endif

4>.add.c檔案中的內容

int add(int a, intb)

5>.sub.c檔案中的內容

int sub(int a, intb)

動態庫的生成

1>首先生成目標檔案,但是此時要加編譯器選項-fpic和鏈結器選項-shared,

gcc-fpic -c add.c

gcc-fpic -c sub.c

生成中間檔案add.o和sub.o

2>其次生成動態庫

gcc-shared –o libtiger.so add.o sub.o

生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程式生成可執行程式

說明:以上兩部也可以合成一步搞定:

gcc -fpic -sharedadd.c sub.c -olibtiger.so

2.使用動態鏈結庫

在編譯程式時,使用動態鏈結庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行檔案的時候會鏈結庫檔案。

1>使用命令:

gcc-o main main.c-l ./ -ltiger

2>-l指定動態鏈結庫的路勁,-ldtiger鏈結庫函式tiger。-ltiger是動態庫的呼叫規則。linux系統下的動態庫命名方式是lib*.so,而在鏈結時表示位-l*,*是自己命名的庫名。

3>但是程式會提示如下錯誤

errorwhileloadingsharedlibraries:libtiger.so:cannotopensharedobjectfile:nosuchfileordirect

這是因為程式執行時沒有找到動態鏈結庫造成的。程式編譯時鏈結動態庫和執行時使用動態鏈結庫的概念是不同的,在執行時,程式鏈結的動態鏈結庫需要在系統目錄下才行。

4>使用以下方法可以解決此問題

a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄/lib下(但是,要是超級使用者才可以,因此要使用sudo哦,親)。就可以生成可執行程式了

b.第二種方法是:將動態鏈結庫的目錄放到程式搜尋路徑中,可以將庫的路徑加到環境變數ld_library_path中實現:

exportld_library_path=』pwd』:$ld_library_path

執行此命令後也可以生成可執行程式

小白學Linux之git工具的使用

我相信做過專案的人,對軟體版本管理的重要性是深有所知的。如果程式版本沒有管理好,可能對整個專案來說就是致命的打擊。所以希望大家在做專案時要注意對自己編寫的程式進行乙個良好的管理。前言 git 是乙個快速 可擴充套件的分布式版本控制系統,它具有極為豐富的命令集,對內部系統提供了高階操作和完全訪問 所謂...

Linux複習之動態庫的建立與使用

動態庫的建立 還是以排序函式sort.c與bank.h為例 1.編輯sort.c與bank.件 2.生成sort.o檔案 指令 gcc c fpic sort.c 選項 fpic的作用是將原始檔編譯成帶有pic標誌的目標檔案 3.將檔案加入到動態庫中 動態庫的使用 和靜態庫一樣,動態庫也有引數法和直...

Linux下建立動態庫

在linux下動態庫檔案字尾為.so,其中so代表 shared object,即共享目標檔案。動態庫的特點就是在系統記憶體中,只會存在動態庫的乙個副本。例如 程式a,b允許時都需要動態庫lib.so的支援。當a程式執行時,由於系統記憶體中沒有發現lib.so庫,所以需要載入lib.so。此時b程式...