2013-05-18 91 views
9

我是C++編程新手,剛剛完成了一個簡單的計算器。我決定與我的朋友分享,並在幾次嘗試後發現如何在發佈模式下進行編譯。但是,即使在發佈模式下,它仍然依賴於MSVCP110D.dll。我想知道是否有辦法解決這個問題?發佈模式依然依賴於MSVCP110D.dll(C++ MSVS)

+0

我拉在唯一的外部資源是的#include「stdafx.h中」 的#include 的#include 的#include 但我的印象是,在發行模式,這將刪除所有需要外部資源和將完全在其內部運行。 –

+0

通過不解釋你如何知道你對msvcp100d.dll有依賴關係,你並沒有幫助你或我們。你**在msvcp110.dll的Release版本中有一個依賴項,它包含了iostream的代碼。您需要將它與您的.exe,msvcr110.dll一起復制。或者只是使用/ MT生效,適用於不使用DLL的簡單程序。 –

+0

你嘗試過使用Dependency Walker嗎? – makc

回答

6

1)MSVCP110D.dll是MS C運行時庫的「調試」版本的運行時.dll。所以看起來你的.exe可能並沒有爲「Release」正確構建。

2)下面是 「Visual Studio的運行時可再發行」 信息:

http://www.microsoft.com/en-us/download/details.aspx?id=30679

3)這裏是關於這方面的問題的更多信息:

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/e128dff6-cef5-4a81-b6de-fcbcaa7a23bb

不幸msvcp100D.dll是一個調試DLL,它不包含在Microsoft Visual C++ Redistrutable包中的 年齡。這通常是因爲 調試版本不向其他開發者發佈。 開發人員在Visual Studio中默認安裝了它。

您可以在「Release」中編譯您的項目,這樣您需要的所有dll將被包含在Microsoft Visual C++ Redistrutable包中。

否則,你可以做所有庫的靜態鏈接(指定 發佈/ MT和/ MTD在調試配置到編譯器選項),但 我個人不推薦becouse你把可執行許多 信息(由調試器使用)會減慢你的應用程序。

+0

解決了我。最近遇到類似的問題。最奇怪的是,我的結果DLL依賴於MSVCR100.dll(不帶'D'),這是正確的,因爲我將/ MDd更改爲/ MD,但也取決於MSVCP100D.dll,由於相同的原因,這看起來不正確。經過長期調查,我發現它取決於預處理器的定義。將_DEBUG更改爲DEBUG解決了我的問題。 – Nahum

3

我猜你的問題是依賴於dll的調試版本&而不是依賴於dll本身。

這是非常有可能你做的這些事情2

  1. /DDEBUG/D_DEBUG OR

  2. 編譯具有msvcpd.lib

連接一個當你與/DDEBUG或編譯/D_DEBUG#include其中一個標準的C++頭文件,然後msvcpd.lib我s被拉進(with a #pragma(lib)這導致依賴於msvcpd ***。dll。

msvcp(d)*。dll是標準C++庫的dll版本。

如果相反,你的問題是依賴於任何版本的DLL,即你想靜態鏈接到C++庫,那麼你可以用_STATIC_CPPLIB編譯你的程序。

+0

對不起,我對此非常陌生。但是,我將如何去靜態鏈接DLL?當我編譯它時,我將編譯類型從調試改爲發佈。然後它創建了一個包含我的.exe和.cpp的發佈文件夾。 –

+0

@ user2396111右鍵單擊solution - > properties,C/C++,Preprocessor->將_STATIC_CPPLIB添加到各種現有的預處理器定義中。當你在那裏時,檢查DEBUG或_DEBUG是否已經定義。 – user93353

+1

這不是,也是VS2012中不推薦使用的選項。 C/C++,代碼生成,運行時庫=/MT –

0

您是否在使用其他庫? 也許你已經包含了一個可執行文件的調試版本的dll文件。