Linux下製做靜態庫和動態庫

製做庫文件並使用

1.什麼是庫文件?

所謂庫文件,就是一堆函數的集合。linux

一堆函數源碼的集合 -> ***.c 一堆二進制函數代碼的集合 -> ***.so -> 用戶能夠調用庫裏面的函數,可是沒有辦法看到函數的實現過程。bash

2.庫的格式?

在linux裏面,庫有兩種,一種是靜態庫 -> libxxxx.a 另一種是動態庫/共享庫 -> libxxxx.so函數

3.庫文件名字的含義

例子: libabc.so.0.8接口

lib -> 庫的前綴 abc -> 庫的名字 -> 在工程中連接庫文件時須要使用。 .so -> 庫的後綴 .0 -> 庫的版本號 .8 -> 庫的修正號編譯器

4.靜態庫的特色

例子: libxxxx.a -> 去圖書館(libxxxx.a)把圖書(函數)借走 1)在程序編譯時,須要連接靜態庫,其實就等價於把庫的東西拿走,就致使了可執行程序大小的比較大! 2)因爲是靜態編譯,因此在編譯程序以後,不須要庫文件(libxxxx.a)存在也能夠執行。源碼

5.動態庫的特色

例子: libxxxx.so -> 去圖書館(libxxxx.so)看看書(函數接口),看(編譯是連接)完就放回去,可是再次想看書(調用函數),就必須再去圖書館(庫文件必需要存在)。編譯

1)在程序編譯時,須要連接動態庫,可是並無把庫的東西帶走,因此可執行程序的大小相對小。 2)因爲動態編譯,因此編譯完程序以後,庫文件必須存在才能執行程序。class

庫文件如何製做

庫文件只能將一些不包含main函數在內的.c文件製做成庫文件。 不是main函數的函數寫入.c文件 -> 再將.c文件製做爲庫文件。變量

1.靜態庫的製做

project.c -> 調用fun1()和fun2() fun1()和fun2()都屬於功能函數。gcc

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文件較小時。

2.動態庫的製做

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!

相關文章
相關標籤/搜索