靜態鏈結與動態鏈結

2021-08-27 19:19:32 字數 1055 閱讀 4786

基於gmp開發第三方庫,後者以動態鏈結庫(靜態庫?)對方式發布,

為了效率gmp建議對該庫採用靜態鏈結,

所以,目的是生成靜態鏈結gmp庫的庫檔案(動態庫?靜態庫?)

一、生成可執行檔案

1. 動態鏈結庫的編譯

mac和linux都是:

gcc -o param_convention1 param_convention.c -lgmp

2. 靜態鏈結庫的編譯

mac是:

gcc -o param_convention2 param_convention.c -wl,-no_pie /usr/local/lib/libgmp.a

linux是:

gcc -o param_convention2 param_convention.c -static /usr/lib/x86_64-linux-gnu/libgmp.a

二、生成動態鏈結庫

mac是:

gcc -bundle -flat_namespace -undefined suppress -o pc.so pc.c -wl,-no_pie /usr/local/lib/libgmp.a

或者gcc -dynamiclib -current_version 1.0 -o libpc.dylib pc.c -wl,-no_pie /usr/local/lib/libgmp.a

生成可執行檔案

gcc -o main main.c ./libpc.dylib -wl,-no_pie /usr/local/lib/libgmp.a

或gcc -o main main.c -dynamic -l. -lpc -wl,-no_pie /usr/local/lib/libgmp.a

linux是:

gcc -fpic -shared -o libpc.so

生成可執行檔案

gcc -o main main.c ./libpc.so /usr/lib/x86_64-linux-gnu/libgmp.a

不過雖然gmp不是動態庫了,但是libpc還是動態庫的方式發布,動態庫對效率問題依然存在,似乎不會改善效能?

動態鏈結 靜態鏈結

在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...

靜態鏈結 動態鏈結

如果函式庫的乙份拷貝是可執行檔案的物理組成部分,那麼我們稱之為靜態鏈結。如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找程式所需的函式庫,那麼稱為動態鏈結。即根據函式庫是不是可執行檔案的組成部分區分靜態鏈結和動態鏈結。1 可執行檔案的體積小。2 雖然執行速度稍慢,但是能更加有效的利用磁碟空間,...

靜態鏈結 動態鏈結

所謂靜態 動態是指鏈結。回顧一下,將乙個程式編譯成可執行程式的步驟 圖 編譯過程 靜態庫之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟....