Re: [問題] 靜態函式庫轉動態函式庫

看板C_and_CPP (C/C++)作者 (purpose)時間15年前 (2010/10/19 18:13), 編輯推噓3(3014)
留言17則, 4人參與, 最新討論串2/2 (看更多)
剛剛用簡單的例子建 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

10/19 18:18, , 1F
此篇正解,附註一下 mingw 的 .a 可以用 ar 解開
10/19 18:18, 1F

10/19 18:30, , 2F
謝謝樓上補充。lib.exe /list foo1.lib 可列出目的檔清單
10/19 18:30, 2F

10/19 18:46, , 3F
但是原po好像沒有lib怎麼辦
10/19 18:46, 3F

10/19 18:48, , 4F
又好像有lib
10/19 18:48, 4F

10/19 18:50, , 5F
他的abcd.a應該是gcc產生的,相當於VC的 *.lib,用一樓說
10/19 18:50, 5F

10/19 18:50, , 6F
的 ar.exe 應該可以處理,這我就比較不熟了
10/19 18:50, 6F

10/19 18:53, , 8F
像遊戲內掛技術用到很多原遊戲的含式呼叫
10/19 18:53, 8F

10/19 18:54, , 9F
只有DLL沒lib下也可以辦的到的
10/19 18:54, 9F

10/19 19:10, , 10F
嗯,直接呼叫dll的函數,最麻煩的就是沒有 .h 跟 .pdb 所
10/19 19:10, 10F

10/19 19:10, , 11F
以不知道函數的原型,不知道他的參數資料型態
10/19 19:10, 11F

10/19 19:10, , 12F
通常也就是要反組譯觀察了
10/19 19:10, 12F

10/19 22:36, , 13F
感謝大家熱心的回答,我從purpose給的網址裡的指令修改後就可
10/19 22:36, 13F

10/19 22:36, , 14F
以了 ld --whole-archive -shared -o abcd.dll abcd.a
10/19 22:36, 14F

10/19 22:36, , 15F
--output-def libabcd.def --out-implib libabcd.a
10/19 22:36, 15F

10/19 22:37, , 16F
這樣他就會產生 abcd.dll 和 libabcd.a 可以作為
10/19 22:37, 16F

10/19 22:37, , 17F
程式的動態連結用了
10/19 22:37, 17F
文章代碼(AID): #1ClMzPh9 (C_and_CPP)
文章代碼(AID): #1ClMzPh9 (C_and_CPP)