簡體   English   中英

是否可以在C ++中構建一個沒有依賴關系的DLL?

[英]Is it possible to build a DLL in C++ that has no dependencies?

我想在我的C#應用​​程序中部署一個非常簡單的DLL,但是我在Visual Studio 2008中構建的任何DLL似乎都依賴於“Microsoft.VC90.CRT”。 是否可以使用VS2008構建一個沒有這種依賴的DLL? 如何判斷導致依賴的原因?

我不確定最新的VC ++版本,但之前您可以告訴鏈接器鏈接到靜態版本的MSVCRT運行時庫而不是動態(DLL)版本。 這個選項仍然存在。

根據這個MSDN頁面 ,靜態庫仍然可用。 轉到項目屬性,配置屬性,C / C ++,代碼生成,運行時庫。

為調試配置選擇Multithreaded Debug,為release release配置Multithreaded。 (不確定VS2008中的名稱是否完全相同,但應該是“在那里的某個地方”。明天可以使用VS2008特定的差異進行更新)

另外,正如wbic16所建議的那樣,使用依賴性walker來識別其他靜態依賴項。

如果您完全確定您對C運行時沒有任何依賴關系,那么您可以通過啟用鏈接器 - >輸入項目選項頁面下的“忽略所有默認庫”(/ NODEFAULTLIB)標志來避免鏈接。 您可能還必須禁用基本運行時檢查(在C / C ++下將“基本運行時檢查”設置為默認值 - >代碼生成),您可能還必須刪除入口點(將“無入口點”設置為“是”(/ NOENTRY)“在鏈接器下 - >高級)。

也可以看看 http://support.microsoft.com/kb/814472 ,它提供了有關為托管擴展C ++構建DLL的一些很好的信息。

編輯:請注意,沒有C運行時運行也意味着您沒有像malloc()和new這樣的簡單內存分配功能。

給這個工具一個機會: http//www.dependencywalker.com/ 它將讓您在給定的exe或dll上遍歷您的依賴項。

通過一些工作, libCTiny仍然可以替代默認的lib。 這種庫使/ NODEFAULTLIB可用。

要回答第二個問題,使用/ VERBOSE鏈接器開關,鏈接器將告訴您從哪個庫中獲取哪些符號。

確保你在發布中經常在調試中構建所有東西,dll與通常不隨windows附帶的特殊調試dll鏈接,並將導致依賴性問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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