[爆卦]library函式庫是什麼?優點缺點精華區懶人包

為什麼這篇library函式庫鄉民發文收入到精華區:因為在library函式庫這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者purpose (purpose)看板C_and_CPP標題Re: [問題] 靜態函式庫轉動態函...



剛剛用簡單的例子建 static library,然後用 lib.exe /extract 抽出每個 *.obj,
再自己寫個 .def 然後重新 link 出 dll,這樣跑是可以產生 dll 啦。
但比較複雜的程式,大概就沒辦法連結成功了。

foo1.c
---------
int foo1() {
return 100;
}
---------


foo2.c
---------
int foo2() {
return 200;
}

產生目的檔: cl.exe /c foo1.c foo2.c
產生靜態連結檔: lib.exe foo1.obj foo2.obj

至此,得到靜態連結程式庫「foo1.lib」,可提供 foo1 及 foo2 函數。
刪掉 foo1.c foo2.c foo1.obj foo2.obj。

==================================================================

dumpbin /ARCHIVEMEMBERS foo1.lib

得知內有 foo1.obj 及 foo2.obj

故分別執行
lib.exe foo1.lib /EXTRACT:foo1.obj
lib.exe foo1.lib /EXTRACT:foo2.obj

撰寫模組定義檔 foo.def,假設 dll 將只匯出 foo1 函數:
-----------------------------
LIBRARY myfoo
EXPORTS
foo1
-----------------------------

連結出 dll 檔:
link.exe foo1.obj foo2.obj /DEF:foo.def

則取得動態連結程式庫「myfoo.dll」及匯入用程式庫「foo1.lib」
可以用隱式連結呼叫之。

main.c
----------------------------
#include <stdio.h>
#pragma comment(lib, "foo1")

int foo1();

int main() {
printf("ret = %d\n", foo1());
return 0;
}
----------------------------

檢驗匯入表:dumpbin main.exe /IMPORTS:myfoo.dll


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.131.103
littleshan:此篇正解,附註一下 mingw 的 .a 可以用 ar 解開 10/19 18:18
purpose:謝謝樓上補充。lib.exe /list foo1.lib 可列出目的檔清單 10/19 18:30
stupid0319:但是原po好像沒有lib怎麼辦 10/19 18:46
stupid0319:又好像有lib 10/19 18:48
purpose:他的abcd.a應該是gcc產生的,相當於VC的 *.lib,用一樓說 10/19 18:50
purpose:的 ar.exe 應該可以處理,這我就比較不熟了 10/19 18:50
stupid0319:像遊戲內掛技術用到很多原遊戲的含式呼叫 10/19 18:53
stupid0319:只有DLL沒lib下也可以辦的到的 10/19 18:54
purpose:嗯,直接呼叫dll的函數,最麻煩的就是沒有 .h 跟 .pdb 所 10/19 19:10
purpose:以不知道函數的原型,不知道他的參數資料型態 10/19 19:10
purpose:通常也就是要反組譯觀察了 10/19 19:10
TNYY:感謝大家熱心的回答,我從purpose給的網址裡的指令修改後就可 10/19 22:36
TNYY:以了 ld --whole-archive -shared -o abcd.dll abcd.a 10/19 22:36
TNYY: --output-def libabcd.def --out-implib libabcd.a 10/19 22:36
TNYY:這樣他就會產生 abcd.dll 和 libabcd.a 可以作為 10/19 22:37
TNYY:程式的動態連結用了 10/19 22:37

你可能也想看看

搜尋相關網站