轉載於https://blog.csdn.net/zhangdaisylove/article/details/45721667 1.庫的分類 庫有靜態庫和動態庫,linux下靜態庫為.a,動態庫為.so。windows下靜態庫為.lib,動態庫為.dll。 靜態庫是在編譯的鏈接階段鏈接嵌入到程式中 ...
轉載於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要大很多。
因為靜態庫會鏈接到程式中。