在linux下制作靜態(tài)庫和動態(tài)鏈接庫的方法
靜態(tài)庫 .o文件的集合
制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ...
編譯 gcc main.c -l xxx [-L 庫路徑] (如果不加-L則在標準庫路徑下查找)
運行 ./a.out
基本概念:
靜態(tài)庫又稱為文檔文件(Archive File)。它是多個.o文件的集合。Linux中靜態(tài)庫文件的后綴為"a"。
靜態(tài)庫的代碼在編譯時就已經鏈接到應用程序中
靜態(tài)庫中的各個成員(.o文件)沒有特殊的存在格式,僅僅是一個.o文件的集合。
使用"ar"工具維護和管理靜態(tài)庫
ar的三個參數(shù)中:r代表將文件插入歸檔文件中,c代表建立歸檔文件,s代表若歸檔文件中包含了對象模式,可利用此參數(shù)建立備存文件的符號表。
lib和.a都是系統(tǒng)指定的靜態(tài)庫文件的固定格式,mylib才是靜態(tài)庫的名稱,
編譯時,鏈接器會在標準路徑(/usr/lib;/lib)或者用戶指定的路徑下去找.a的文件。
gcc -o main main.c -static -L. –lmylib
-static指定編譯器鏈接靜態(tài)庫,-L.指定靜態(tài)庫的路徑為當前路徑,
在gcc編譯器中引用可搜索到的目錄和庫文件時需用(-l+庫名),
如在gcc中加入-lm可以在程序匯中鏈接標準算術庫,加上-lpthread可以鏈接到linux標準線程庫
總結:
使用靜態(tài)庫可以使程序不依賴于任何其他庫而獨立運行,但是會占用很多內存空間以及磁盤空間,
而且如果庫文件更新,則需重新編譯源代碼,使用起來不夠靈活.其實,編譯的時候不需要加-static,
直接用gcc -o main main.c -L. –lmylib,連接器會為我們鏈接指定的靜態(tài)庫以及標準C的共享庫。
============================================
動態(tài)庫 并不包含在可執(zhí)行文件中 在執(zhí)行時才加載動態(tài)庫
制作 gcc -shared -fPIC xxx.c -o libxxx.so
編譯 gcc main.c -l xxx [-L 編譯時庫路徑]
臨時指定運行時的庫查找路徑 [LD_LIBRARY_PATH=(運行時庫路徑)] ./a.out
如果不指定則在標準路徑下找
當你發(fā)布庫要標準路徑“/usr/lib 或 /lib”就不需要其它操作,但
gcc 時一定要加“-l”指定的庫名
永久修改運行時的庫查找路徑
/etc/ld.so.conf 修改連接器的配置文件
ldconfig 使配置文件生效
3、編譯參數(shù)解析
最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態(tài)連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執(zhí)行文件
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態(tài)載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
-L.:表示要連接的庫在當前目錄中
-ltest:編譯器查找動態(tài)連接庫時有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
LD_LIBRARY_PATH:這個環(huán)境變量指示動態(tài)連接器可以裝載動態(tài)庫的路徑。
當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,
不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!