1.動態鏈接庫是程序運行時加載的庫,當動態鏈接庫正確安裝后,所有的程序都可以使用動態庫來運行程序。動態鏈接庫是目標文件的集合,目標文件在動態鏈接庫中的組織方式是按照特殊方式形成的。庫中函數和變量的地址是相對地址,不是絕對地址,其真實地址在調用動態庫的程序加載時形成。
2.動態鏈接庫的名稱有別名(soname),真名(realname)和鏈接名(linkername)。別名由一個前綴lib,然后是庫的名字,再加上一個后綴“.so”構成。真名是動態鏈接庫真實名稱,一般總是在別名的基礎加上一個小版本號,發布版本等構成。除此之外,還有一個鏈接名,即程序鏈接時使用的庫的名字。
3.在動態鏈接庫安裝的時候,總是復制文件到某個目錄下,然后用一個軟連接生成別名,在庫文件進行更新的時候,僅僅更新軟鏈接即可。
二.生成和使用動態庫1.看一個實例來了解如何自己生成靜態庫和使用靜態庫
1>在test文件夾下有三個文件:main.c,add.c,sub.c,tiger.h
2>main.c文件中的內容:
#include<stdio.h>#include”tiger.h”int main(void){ PRintf(“sum =%d/n”,add(5,3)); printf(“sub= %d/n”,sub(5,3)); return 0; }3>.tiger.h文件中的內容:
#ifndef __TIGER__#define __TIGER__int add(int a,int b);int sub(int a,int b);#endif
4>.add.c文件中的內容
int add(int a, int b){ return a +b;}5>.sub.c文件中的內容
int sub(int a, int b){ return a - b;}動態庫的生成
1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,
gcc-fpic-cadd.c
gcc-fpic-csub.c
生成中間文件add.o和sub.o
2>其次生成動態庫
gcc-shared–olibtiger.soadd.osub.o
生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以后使用動態庫和main.c程序生成可執行程序
說明:
以上兩部也可以合成一步搞定:
gcc-fpic-sharedadd.csub.c-olibtiger.so
2.使用動態鏈接庫
在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用”-l庫名”的方式,在生成可執行文件的時候會鏈接庫文件。
1>使用命令:
gcc-omainmain.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下動態庫生成和使用
新聞熱點
疑難解答