如何創建動態庫


靜態庫是在鏈接階段被鏈接的,所以生成的可執行文件就不受庫的影響,即使庫被刪除,程序依然可以成功運行。

而依賴動態庫的程序其實也有鏈接動態庫的階段,只不過這個鏈接並不是真正的將動態庫鏈接到程序中,其目的是告訴程序,所依賴的到底是哪個動態庫。

靜態庫有點類似於將靜態庫復制到程序中,而動態庫是在程序中創建一個軟連接。

比如:

//a.c  主程序源代碼
#include <stdio.h>
#include "b.h"
main(){
bb();
}

//b.h 主程序依賴b庫,b庫的頭文件是b.h
int a;
void bb(void);

//b.c b庫源代碼
#include <stdio.h>
#include "b.h"
int a=7;
void bb(){
printf("das%d\n",a);
}

首先生成動態庫:

       第一步:生成b.o目標文件,使用如下命令。在此處需要添加-fPIC參數,該參數用於生成位置無關代碼已工生成動態庫使用,使用命令:gcc -c -o b.o -fPIC b.c

  第二步:使用-shared參數生成動態庫,使用如下命令:gcc -shared -o libb.so b.o,

       不過上述兩部可以連在一起,:gcc -shared -fPIC -o libb.so b.c

接下來就是將程序文件a.c鏈接動態庫生成二進制可執行程序的過程了,這里有很多方法:

 

方法一:如果將libb.so移動到/lib64;/usr/lib64;這兩個任意目錄下,直接用命令gcc -o a a.c -lb,則鏈接成功,

但是不提倡用這個方法,因為是我們自己編寫的庫文件,/lib;/usr/lib64這兩個文件夾下都是些系統的庫文件,所以還是不要碰這兩個文件夾了

 

方法二:我們先在本地目錄下生成動態庫文件,然后將本目錄加入到系統搜索動態庫文件的環境變量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH)(事實上動態庫的環境變量不只這一個,還有LD_PRELOAD,詳見其他博客),然后再執行gcc -o a a.c -L. -lb

方法三,指定動態文件的位置,比如gcc -o a a.c /root/libb.so;gcc -o a a.c ./libb.so

一旦指定了動態文件的位置,動態文件將不能移動。以下通過gcc -o a a.c ./libb.so舉例(我本人推薦此方法):

gcc -o a a.c ./libb.so

在方法三中,鏈接時已經明確了動態庫的位置,所以如果移動動態庫,甚至將動態庫移動至/lib64目錄下,或者將主程序a移動至其他目錄,都將導致程序運行失敗,只要保證動態庫與可執行程序保持在同一文件夾下才有效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM