Linux系統中靜態庫和動態庫的生成和使用

2021-06-05 23:30:58 字數 1742 閱讀 3368

一、靜態庫的建立和使用:

1、生成靜態庫 :庫名 libmylib.a

ar rcs libmylib.a mylib.o

2、將靜態庫copy到 /usr/lib/ 或/lib/ 目錄下

cp libmylib.a /usr/lib/

3、靜態庫的使用

比如測試檔案為test.c

gcc -0 test test.c -lmylib

-l為選項, mylib為庫名。mylib為libmylib的中間部分,linux下約定所有庫都以字首lib開始

靜態庫以.a結尾,動態庫以.so結尾。再編譯程式時,無需帶上字首和字尾。

注重:靜態庫的命名需要以"lib"開頭,否者連線是編譯器無法找到庫

二、動態庫的建立和使用:

1、下面命令把mylib.c程式建立成了乙個動態庫

、gcc -fpic -o mylib.o -c mylib.c

、gcc -shared -o libttt.so mylib.o

也可以直接使用一條命令

gcc -fpic -shared -o libttt.so mylib.c

2、linux有兩種方式呼叫動態庫連線中的函式

、gcc -o test test.c ./libttt.so

、cp libttt.so /usr/lib/libttt.so

gcc -o test test.c /usr/lib/libttt.so

注重:引用動態庫時,必須含有路徑,假如只是使用libttt.so,則必須確保這個庫所在目錄包括再path 環境變數中

三、系統函式使用動態庫:

1、void dlopen

用於開啟指定名字的動態鏈結庫,並返回乙個控制代碼

flag:rtld_lazy, rtld_new, rtld_global

rtld_lazy:在dlopen返回前,對於動態庫中存在的未定義的變數

不執行解析,也就是不解析這個變數的位址

rtld_new:與rtld_lazy 不同,在dlopen返回前,解析處每個未定義的變數的位址,假如解析不出來,dlopen會返回null,錯位為"undefined symbol:***..."

rtld_global:是庫中被解析出來的變數在隨後的其它鏈結庫中也可以使用,即全域性有效。

2、void dlsym

3、int dlclose

關閉動態鏈結庫,handle是呼叫dlopen函式庫的控制代碼

4、const char dlerror

動態庫鏈結庫執行失敗時,dlerror返回錯誤,若執行成功,則返回null

例子:

main.cint mainwelcome = dlsym;if ) != null)welcome;dlclose;return 0;}gcc -ldl -o main main.c

-ldl 指明dlopen函式所在的庫。

注重:dlopen,的目錄是在當前目錄下,假如不在當前目錄下,程式執行錯誤

共享庫進行更新或安裝新庫後,必須執行ldconfig命令更新/etc/ld.conf檔案中相應的項

假如使用rpm進行安裝,一般會自動進行更新,不過也不能保證這一點。

使用數學庫時加上 -lm

gcc -lm

庫工具使用:

ldd 工具

ldd 用來顯示執行檔案需要哪些共享庫, 共享庫裝載治理器在**找到了需要的共享庫。

Linux中建立靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時 會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要 動態庫存在。本文主要通過舉例來說明在linux中如何建立...

Linux中建立靜態庫和動態庫

分類 程式人生 2008 11 05 00 26 257人閱讀 收藏舉報 我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時 會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在...

linux中建立靜態庫和動態庫

1.函式庫有兩種 靜態庫和動態庫。靜態庫在程式編譯的時候會被連線到目標 中,程式執行時將不再需要改靜態庫。動態庫中程式編譯的時候並不會連線到目標 中,而是在程式執行時才被載入,因此在程式執行的時候還需要動態庫的存在。程式1 hello.h ifndef hello h define hello h ...