我想知道是否可以將多個DLL組合成1個。我目前正在研究一個依賴於許多動態鏈接庫的C++項目,所以將它們組合成1 DLL文件,如果是這樣,我該怎麼做?將多個DLL組合成1
回答
實際上,沒有。理論上,如果你想足夠糟糕,你可以做一些反彙編所有的東西,然後將所有單獨的文件重新組裝成目標文件,然後將這些目標文件重新鏈接成一個大的DLL。實際工作通常不是微不足道的 - 可能會出現諸如衝突的符號名稱之類的事情,需要大量工作才能解決。
一個比較乾淨的可能性是將所有的DLL打包成一個zip文件(或任何你喜歡的),並有一個小程序將它們解壓縮到一個臨時目錄,運行主程序,然後從那裏清除DLL目錄。儘管如此,它也有一些問題(例如,如果機器崩潰/失去電源/在運行期間丟失任何文件,則會留下文件的副本)。
編輯:由於您有源代碼,使用它將所有代碼構建到單個DLL中更加合理。大多數情況下,只需將所有源文件添加到創建一個DLL作爲其輸出的單個項目即可。你可能(很容易)遇到一些符號衝突。鑑於對源代碼的訪問,處理這個問題的顯而易見的方法是將東西放入命名空間。
它當然不可行。 Dll格式包含將代碼和多個dll中的數據合併爲一個所需的全部信息,並對生成的代碼進行重新綁定。
這不是我能想到的任何工具鏈的標準功能。
在一般情況下,這是不可能的,你會有很多重複的符號。 CRT的各個部分(所有這些都是靜態鏈接的)都將在兩個過程中進行,可能會進行優化,因此它們不是完全相同的副本。 – Blindy 2010-08-29 18:29:31
這將重新鏈接。沒有需要將兩個dll粘合在一起的名稱級操作。你所要做的就是連接,或者創建重複(重命名).text,.sdata等節(這些節的名稱實際上並不相關)。然後處理重新定位表 - 根據合併部分的新基地址進行調整。 符號名稱不會進入它(除非您試圖修復調試信息)。 – 2010-08-29 18:50:02
如果組合的DLL之一依賴於另一個DLL,則還必須清理導入地址表。你不能依靠自己。這是一個名稱級別的操作;必須按範圍(DLL)和符號名稱匹配導入和導出的條目。 – MSalters 2010-08-30 10:08:56
我確實有這些dll的源代碼,是的。
只需將所有DLL項目的所有源文件合併到一個DLL項目中?
如果您有多個* .def文件(每個項目一個),然後將它們組合成一個* .def文件。
- 1. 將多行組合成1
- 2. 將多個SQL字段組合成1個輸出行
- 3. 將多個記錄與1個ID組合成Access中的1個記錄
- 4. 將多個圖組合成單個圖
- 5. 將多個表單數組組合爲1個數組
- 6. 將2個關鍵數組合併成1個關聯數組
- 7. 將多行組合成一個MySQL
- 8. 將多行組合成一個查詢
- 9. 如何將4個多維數組合併爲1個多維
- 10. 將重複值組合成1行?
- 11. 生成多個組合的組合
- 12. 如何將多個directx LP3DXMESH組合成1個網格進行快速渲染?
- 13. 將2個字段組合成1個字段
- 14. PHP:將2個數組組合成1個數組並使用通用索引
- 15. 將多個模型組合到1個視圖導軌中
- 16. 將2個數組合併成一個多維數組?
- 17. 將多個字節[]數組組合成一個文件
- 18. 將多個數組值組合成一個字符串值?
- 19. 將兩個數組合併成一個多維數組
- 20. 將多個數組聚合成一個數組(Linq)
- 21. 將多個類組合成多個動畫
- 22. 熊貓將多個相同x軸的子圖組合成1條形圖
- 23. 使用子程序perl將腳本組合成1個腳本
- 24. 如何將TextBlock和Rectangle組合成1個元素?
- 25. 將2個日期行組合成2行1列
- 26. 將多個MySQL查詢合併爲1
- 27. 將多個圖像合併爲1
- 28. 是否有可能多個S-功能組合成一個單一的MEX/DLL
- 29. 如何將dll合併爲一個dll
- 30. 在MySQL中將多行組合成一個沒有組concat
你能澄清你是否有這些DLL的源代碼? – ysth 2010-08-29 18:09:24
我確實有這些DLL的源代碼,是的。 – 2010-08-29 18:14:23