1. 動態連接庫是程序運行時加載的庫,當動態連接庫正確安裝後,全部的程序均可以使用動態庫來運行程序。動態連接庫是目標文件的集合,目標文件在動態連接庫中的組織方式是按照特殊方式造成的。庫中函數和變量的地址是相對地址,不是絕對地址,其真實地址在調用動態庫的程序加載時造成。php
2. 動態連接庫的名稱有別名(soname), 真名(realname)和連接名(linker name)。別名由一個前綴lib,而後是庫的名字,再加上一個後綴「.so」構成。真名是動態連接庫真實名稱,通常老是在別名的基礎加上一個小版本號,發佈版本等構成。除此以外,還有一個連接名,即程序連接時使用的庫的名字。linux
3.在動態連接庫安裝的時候,老是複製文件到某個目錄下,而後用一個軟鏈接生成別名,在庫文件進行更新的時候,僅僅更新軟連接便可。函數
1.看一個實例來了解如何本身生成靜態庫和使用靜態庫spa
建立程序文件.net
1>在test文件夾下有三個文件: main.c ,add.c,sub.c,tiger.hcode
2> main.c文件中的內容:blog
1
2
3
4
5
6
7
8
9
10
11
|
#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文件中的內容:ci
1
2
3
4
5
6
7
|
#ifndef __TIGER__
#define __TIGER__
int
add(
int
a,
int
b);
int
sub(
int
a,
int
b);
#endif
|
4>.add.c文件中的內容get
1
2
3
4
|
int
add(
int
a,
int
b)
{
return
a +b;
}
|
5>.sub.c文件中的內容編譯器
1
2
3
4
|
int
sub(
int
a,
int
b)
{
return
a - b;
}
|
動態庫的生成
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 -shared add.c sub.c -o libtiger.so
2.使用動態連接庫
在編譯程序時,使用動態連接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會連接庫文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定動態連接庫的路勁,-ldtiger連接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在連接時表示位-l*,*是本身命名的庫名。
3>可是程序會提示以下錯誤
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
這是由於程序運行時沒有找到動態連接庫形成的。程序編譯時連接動態庫和運行時使用動態連接庫的概念是不一樣的,在運行時,程序連接的動態連接庫須要在系統目錄下才行。
4>使用如下方法能夠解決此問題
a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(可是,要是超級用戶才能夠,所以要使用sudo哦,親)。就能夠生成可執行程序了
b.第二種方法是:將動態連接庫的目錄放到程序搜索路徑中,能夠將庫的路徑加到環境變量LD_LIBRARY_PATH中實現:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
執行此命令後也能夠生成可執行程序