Linux下動態庫的生成和使用

一.動態庫的基本概念

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

執行此命令後也能夠生成可執行程序

原文連接:http://blog.csdn.net/tigerjb/article/details/6992531

相關文章
相關標籤/搜索