背景:
我目前正在.dll使用 Visual C (不是 C )撰寫一個庫,旨在為其他應用程式提供性能優化的功能。該庫中的所有函式都滿足以下要求:
- 它們純粹在內置的原始型別(
int、long long等)、指向這些型別的指標或struct由這些型別組成的自定義 s 上運行。 - 沒有代碼段依賴于外部代碼或庫——甚至不依賴于
malloc或free. 我不呼叫我自己沒有撰寫的任何函式(我什至重寫了abs行內匯編代碼之類的函式以避免任何外部函式呼叫)。
此外:
- 該庫沒有外部依賴項
- 該代碼沒有任何
#include ...- 陳述句 - 該庫是用純 C 撰寫的(符合 C99 標準 - 除了
__declspec(dllexport)裝飾一些撰寫函式的 - 陳述句)
問題:
- 重新部署/重新分發此特定庫所需的依賴項是什么?我認為我不需要 MSVC 運行時,因為我不使用任何外部型別、函式或依賴項,對嗎?
假設我之前的假設不正確,我需要包含/重新分發 MSVC 運行時的哪些部分?
uj5u.com熱心網友回復:
即使對于簡單的代碼(生成 32 位代碼時的 64 位乘法/除法/移位等),Visual C 也可能默認引入依賴項。如果事實證明您需要它提供的某些功能,那么您必須靜態鏈接 C 運行時庫 ( /MT)。
你也可以強制它不依賴任何東西。用類似的東西編譯/O1 /GR- /GS- /GL /EHscr- /LD /Zl /link /NODEFAULTLIB /OPT:REF /OPT:ICF=9 kernel32.lib user32.lib。
/Zl阻止您使用DllMain,如果您確實需要它,則必須使用它DllMainCRTStartup。您可能必須嘗試使用?? 、 和 的組合/Zl來/LD找到/MT您/MD的最佳位置。
使用Dependency Walker驗證您沒有鏈接到任何*crt*/ *vc*.dll...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504368.html
上一篇:使用ExecuteScalar在客戶端(C#Winform)的SQLServer中從try/catch中捕獲錯誤
