2011-07-18 46 views
1

我有一個我分發的dll,它不會在某些Windows操作系統上運行。使用依賴walker我發現這些系統上缺少msvcp90d.dll。 I 不要想要任何需要C++可再發行的運行時依賴,並且因爲調用DLL的應用程序不是用C++編寫的,所以它對C++可再發行組件沒有任何依賴關係。從Windows二進制文件中刪除msvcp90d.dll依賴項

我猜我離開了DEBUG選項的鏈接器首選項當我編譯的dll這就是爲什麼它需要msvcp90d.dll?

新增: Appologies,我在監視器前在我原來的問題粘貼錯誤的DLL名稱....太多時間......

該DLL是一個第三方的DLL,我沒有寫我在VS2008編譯。

+0

msvcp90d?看起來像你離開調試,以及使用動態鏈接。我希望你正在使用msbuild腳本以可重複的方式構建這個DLL?我希望你不是從IDE構建的! –

回答

3

MSVCP90與調試無關(即將msvcp90 d)。您可以通過將編譯器切換到/ MT(而不是/ MD)來刪除依賴項。你還需要確保你鏈接到的每個靜態庫也被編譯/ MT。

我建議不要構建應用程序/ MT,因爲它會對系統性能產生顯着的負面影響,並在CRT出現安全問題時使服務時間延長。

最後,請注意/ MT意味着您的CRT是私人的。所以你必須確保CRT/STL類型不會通過你的DLL邊界。

馬丁

+1

「對系統性能有顯着的負面影響」請您詳細說明一下嗎? –

+0

Appologies,我在我原來的問題中粘貼了錯誤的dll名稱 –

+0

@David - 如果每個人都加載msvcp90(通常是winsxs),操作系統將只爲每個進程花費一組頁面。如果你是靜態鏈接,那麼相同的代碼會被加載很多次,浪費大量頁面。每個額外的靜態鏈接人員的總體影響是顯着的。 –

1

它需要MSVCP90.dll,因爲dll最可能是用Visual Studio 2008編譯的。這是發行版運行時。簡短的回答是,如果您不希望C++運行時依賴關係不使用C++庫或應用程序。

但是你可以做以下任何的解決你的問題:

  1. 安裝可再發行到目標系統,以滿足依賴
  2. 從您的應用程序
  3. 重新編譯卸下該DLL的依賴該DLL反對你更喜歡已經存在於目標系統上的VC版本
+0

Appologies,我在我原來的問題中粘貼了錯誤的dll名稱 –

+0

啊然後簡單地編譯發佈中的DLL可能就足夠了,或者像其他人所建議的那樣去靜態路由。大多數Windows系統已經有發行版運行時可再發行版。 – AJG85

2

你的選項,我看到他們:

  1. 編譯DLL與使用靜態鏈接到C運行時/ MT選項。
  2. 繼續動態鏈接到運行時,但將C運行時與您的應用程序一起分發。
+0

用於靜態鏈接的+1我將該選項留出,因爲我很少需要/ MT – AJG85

+2

@ AJG85附帶的膨脹或其他問題我喜歡靜態鏈接。我討厭重新分配運行時間。正如我們所說的那樣,課程中的馬。 –

+0

我也喜歡靜態鏈接。 Appologies,我在我的原始問題中粘貼了錯誤的dll名稱 –