轉載於https://blog.csdn.net/zhangdaisylove/article/details/45721667
1.庫的分類
庫有靜態庫和動態庫,linux下靜態庫為.a,動態庫為.so。windows下靜態庫為.lib,動態庫為.dll。
靜態庫是在編譯的連結階段連結嵌入到程式中。因此連結了靜態庫的程式之後與靜態庫沒有了關係,你如果更新了靜態庫,使用靜態庫的程式需要重新連結。
動態庫在在執行階段載入的,不會連結到使用動態庫的程式中。有點是一旦修改了動態庫,所有使用動態庫的程式都會自動載入,無需再次編譯。
2.庫的生成
下面命令在linux環境下執行,以test.c舉例
動態庫的生成
gcc -share test.c -o libtest.so
靜態庫的生成
由於靜態庫是在連結階段連結的,因此靜態庫實際上就是編譯階段的.o目標檔案的歸檔檔案
gcc -c test.c會生成test.o
ar -r libtest.a test.o
可以將多個.o檔案打包到一個庫中
3.庫的載入
gcc預設會在/lib 和/user/lib下查詢庫
比如test.c會使用到加密庫中的函式
gcc test.c -lcrypto -o test
gcc會自動到/lib和/usr/lib路徑下查詢libcrypto.a或者libcrypto.so
當庫不在/lib和 /usr/lib路徑下時,需要手動指定庫連結
可以使用-L,比如在當前路徑下查詢庫
gcc test.c -L. -lcrypto -o test
另外程式連結庫時如果沒有使用-static選項,一般會優先使用動態庫。
要載入靜態庫需要使用-static選項
gcc test.c -lcrypto -static -o teststatic
明顯可以看到teststatic比test要大很多。
因為靜態庫會連結到程式中。