鏈結期和執行期的動態鏈結庫

2021-06-25 23:43:51 字數 1437 閱讀 9850

可執行檔案在查詢依賴的動態鏈結庫時,是根據 /etc/ld.so.conf 和 $ld_library_path 查詢的。

所以,換了機器執行(如開發機和線上機),鏈結到的共享庫可能不一致。

另外,鏈結期可以hard code所要鏈結的庫的路徑。這樣,即使換了機器,執行期也會從hard code的路徑去尋找庫。

例子:開發機上:

server.h

void fun();

server.c

#include void fun()

server_2.c

#include void fun()

test.c

#include "server.h"

#include "stdio.h"

int main()

命令:

gcc server.c -shared -fpic -o libserver.so
gcc test.c -l. -lserver -o test
export ld_library_path=$ld_library_path:"current_path"
./test
*****output: server fun.

將這些檔案放到另外一台機器上

mv libserver_2.so libserver.so
export ld_library_path=$ld_library_path:"current_path_on_this_machine"
./test
*****output:  server fun.server fun.server fun.server fun.server fun.server fun.

另外,如果在編譯test時使用libserver.so的絕對路徑: 

gcc test.c current_path/libserver.so -o test
那麼,另外一台機器上執行時,如果 current_path 和 current_path_on_this_machine 不同,則報錯:

./test: error while loading shared libraries: current_path/libserver.so: cannot open shared object file: permission denied

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...