1、使用gcc建立和使用靜態庫
(1)gcc –o mylib.o –c mylib.c //生成o檔案
(2)ar -rcs libmylib.a mylib.o //生成a檔案
-c create的意思
-r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。
(3)cp libmylib.a /usr/lib/ //拷貝到預設目錄
(4)編寫程式使用庫中的函式,需要包含相關的標頭檔案,即可用下面的方式進行編譯連線。
gcc –o test test.c -l. -lmylib
-l指定靜態函式庫的位置供查詢,注意l後面還有'.',表示靜態函式庫在本目錄下查詢。
-l則指定了靜態函式庫名,由於靜態函式庫的命名方式是lib***.a,其中的lib和.a忽略。
2、使用gcc建立和使用動態庫
(1)gcc –fpic –o mylib.o –c mylib.c
gcc –shared –o libtt.so mylib.o
-fpic 作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code),則產生的**中,沒有絕對位址,全部使用相對位址,故而**可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的。
-shared 作用於鏈結階段,實際傳遞給鏈結器ld,讓其新增作為共享庫所需要的額外描述資訊,去除共享庫所不需的資訊。
(2)也可以直接使用下面一條命令:
gcc –fpic –shared –o libtt.so mylib.c
(3)將動態庫拷貝到linux 的標準庫中,usr/local/lib 或者/usr/lib 或者/lib,使用ldconfig命令載入
cp libttt.so /usr/local/lib
(4) 編譯src 程式使用動態庫,隱式呼叫方法: 在編譯呼叫庫函式**時指明動態庫的位置及名字
gcc –o test test.c ./usr/lib/libttt.so
(5)編譯src程式使用動態庫,顯示呼叫方法
顯式呼叫動態庫需要四個函式的支援, 函式 dlopen 開啟動態庫, 函式 dlsym 獲取動態庫中物件基址, 函式 dlerror 獲取顯式動態庫操作中的錯誤資訊, 函式 doclose 關閉動態庫.
#include
int main()
pfunc = (void (*)())dlsym(phandle, "print"); // 獲取庫函式 print 的位址
if(pfunc)
pfunc();
else
printf("can't find function print\n");
dlclose(phandle); // 關閉動態庫
return 0; }
gcc –o test test.c -lttt -l
此時會到系統目錄下去搜素libttt.so檔案,具體搜尋方法見下一節。
3、shell 搜尋動態庫路徑位置的兩種方法
(1) 使用命令匯入動態庫的路徑,命令如下:
export ld_library_path=dir (如/usr/local/lib)
(2) 在/etc/ld.so.conf 檔案中更增加一條,修改後用ldconfig 命令載入修改。
4、其他
(1)ldd命令可以檢視乙個可執行程式依賴的共享庫,
# ldd /bin/ln
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依賴於libc庫和ld-linux庫
(2)看動態庫包含哪些定義用:
nm -d lib*.so
Linux下的動態庫和靜態庫
靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...
Linux下的動態庫和靜態庫
1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...
linux下檢視動態庫和靜態庫
靜態庫用ar t yourfile 動態庫用 nm d yourfile 下面是ar和nm命令的一些引數說明 1.ar基本用法 ar命令可以用來建立 修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,裡面包含了按照特定的結構組織起來的其它的一些檔案 稱做此庫檔案的member 原始檔案的內容 模式...