![](/img/trans.png)
[英]C++ Win32 without C Runtime library dependency but with malloc, free atd
[英]How do I create a Win32 DLL without a dependency on the C runtime
使用Visual Studio 2008及其C / C ++編譯器,如何創建僅依賴於其他Windows DLL的Win32 DLL,並且不依賴於Microsoft C運行時?
我有一些C代碼,我想放在一個完全計算的DLL中,幾乎不使用C庫函數。
對於它確實使用的那些(例如memcpy),我很樂意重新編寫代碼以使用Win32 API等價物(例如CopyMemory)。
使用/ NODEFAULTLIB鏈接器選項(當然)確保您沒有對運行時的實際依賴性。 您還必須使用/ ENTRY鏈接器選項指定和定義自己的DLL入口點,或者使用您自己的入口點函數來匹配編譯器/鏈接器所需的名稱(對於dll,即_DllMainCRTStartup
)。
在LIBCTINY上發表的Matt Pietrek的文章可能會提供您需要的所有信息:
對於“調試”模式試試這個:
對於“釋放”模式,除了在最后一步中選擇多線程(/ MT)之外,執行相同的步驟。
這會導致程序中使用的任何C運行時函數靜態鏈接到二進制文件。
/NODEFAULTLIB
鏈接器標志實際上不是正確的標志。 它將忽略所有默認庫,包括uuid.lib
等其他uuid.lib
。
你想要的是/Zl
編譯器選項,“省略.OBJ中的默認庫名稱”。
您必須確保您使用的Win32 DLL都不需要C運行時,否則您需要返回第一個。 如果其中一個Win32 DLL依賴於C運行時,靜態編譯DLL將無關緊要。
我能看到這個工作的唯一方法是將所有依賴DLL(如果可行的話)靜態鏈接到DLL中。 這當然意味着您必須重新編譯才能利用任何DLL更新。
有些Windows庫依賴於C運行時(例如ODBC32.DLL),所以我認為你在這里隱藏着什么。 無論如何,你為什么要這樣做?
用靜態microsoft lib編譯它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.