Linux下製作靜態庫和動態庫

2021-10-10 13:53:21 字數 1805 閱讀 2377

所謂庫檔案,就是一堆函式的集合。

一堆函式原始碼的集合 -> ***.c

一堆二進位制函式**的集合 -> ***.so -> 使用者可以呼叫庫裡面的函式,但是沒有辦法看到函式的實現過程。

在linux裡面,庫有兩種,一種是靜態庫 -> lib***x.a

另外一種是動態庫/共享庫 -> lib***x.so

例子: libabc.so.0.8

lib -> 庫的字首

abc -> 庫的名字 -> 在工程中鏈結庫檔案時需要使用。

.so -> 庫的字尾

.0 -> 庫的版本號

.8 -> 庫的修正號

例子: lib***x.a -> 去圖書館(lib***x.a)把圖書(函式)借走

1)在程式編譯時,需要鏈結靜態庫,其實就等價於把庫的東西拿走,就導致了可執行程式大小的比較大!

2)由於是靜態編譯,所以在編譯程式之後,不需要庫檔案(lib***x.a)存在也可以執行。

1)在程式編譯時,需要鏈結動態庫,但是並沒有把庫的東西帶走,所以可執行程式的大小相對小。

2)由於動態編譯,所以編譯完程式之後,庫檔案必須存在才能執行程式。

庫檔案只能將一些不包含main函式在內的.c檔案製作成庫檔案。

不是main函式的函式寫入.c檔案 -> 再將.c檔案製作為庫檔案。

project.c -> 呼叫fun1()和fun2()

fun1()和fun2()都屬於功能函式。

1)將工程中不包含main函式在內的.c檔案編譯為.o檔案

gcc fun1.c -o fun1.o -c

gcc fun2.c -o fun2.o -c

2)將所有.o檔案的塞進乙個.a檔案 -> 庫檔案的名字你自己定!

ar rcs libmy.a fun1.o fun2.o

3)編譯程式,鏈結庫檔案。

gcc project.c -o project -l . -lmy

-l . 在當前目錄下尋找庫檔案

-lmy 指定鏈結my這個庫 -> 注意-l後面是沒有空格!

4)執行

./project -> 不需要庫的存在也可以!

靜態庫使用於不含main函式在內的.c檔案較小時。

1)將工程中不包含main函式在內的.c檔案編譯為.o檔案

gcc fun1.c -o fun1.o -c -fpic

gcc fun2.c -o fun2.o -c -fpic

2)製作動態庫需要使用gcc編譯器

gcc -shared -fpic -o libmy2.so fun1.o fun2.o

3)編譯程式

gcc project.c -o project -l . -lmy2 -> 沒有拷貝庫中的內容。

4)執行

./project

//執行project找不到庫檔案的路徑

./project: error while loading shared libraries: libmy2.so: cannot open shared object file: no such file or directory

解決方案一: 系統預設去/lib尋找庫檔案,只需要將libmy2.so放置到/lib即可。

解決方案二: 指定系統還可以去哪個路徑下尋找庫檔案 -> 使用環境變數 ld_library_path

export ld_library_path=$ld_library_path:/home/gec -> 永久修改寫入: .bashrc

4)重新執行 ./project

helloworld!

hello!

helloworld!

Linux下製作動態庫與靜態庫

靜態函式庫 1.這類庫的名字一般是lib a 2.利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程...

linux下製作靜態庫和動態庫的方法

我們都知道 a 代表靜態庫 so 代表動態庫。那麼這兩個庫到底怎麼製作呢?製作靜態庫的方法 把 編譯為目標檔案形式 gcc c liberr.c o liberr.o 使用工具ar建立乙個存檔檔案 ar rcs liberr.a liberr.o 編譯程式時把程式和liberr.a gcc errt...

Linux靜態庫和動態庫的製作

1.什麼是庫檔案?儲存函式和變數 特點 儲存的函式與變數只能使用但不能看到其實現 2.linux庫檔案 靜態庫 在編譯階段載入 將庫檔案的 載入到原始檔 動態庫 在執行時載入 3.生成可執行檔案存在的區別 優缺點 1 使用靜態庫生成的可執行檔案大於動態庫生成的可執行檔案 程式占用的記憶體較多 2 使...