gcc庫連結

張楊發表於2018-04-11

轉載於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要大很多。

因為靜態庫會連結到程式中。

 

相關文章