所謂庫檔案,就是一堆函式的集合。
一堆函式原始碼的集合 -> ***.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 使...