簡體   English   中英

如何在不依賴於C運行時的情況下創建Win32 DLL

[英]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的文章可能會提供您需要的所有信息:

您可能比您想象的更多依賴CRT。 它消除了線程本地存儲等資源,全局類初始化器由main()之前的CRT運行。

正如有人所說,考慮使用靜態CRT進行鏈接,如果你真的不想這樣做,請像其他人所說的那樣使用/ NODEFAULTLIB和/ ENTRY。

哦,而不是重新編寫 memcpy,考慮使用內在的超快編譯器 您可以使用/ Oi打開內在函數。

對於“調試”模式試試這個:

  1. 轉到Project \\ [Projectname]屬性...
  2. 打開配置屬性
  3. 打開C / C ++
  4. 開放代碼生成
  5. 對於運行時庫選擇多線程調試(/ MTd)而不是多線程調試DLL(/ MDd)

對於“釋放”模式,除了在最后一步中選擇多線程(/ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM