2013-09-23 187 views
6

我想我跑在Visual Studio 2013年編譯的程序不過,我得到了錯誤MSVCP110D.dll和Visual Studio 2013

The program can't start because MSVCP110D.dll is missing from 
your computer. Try reinstalling the program to fix this problem. 

這不是一個非常有用的錯誤。但是,谷歌搜索後,我發現它(顯然)試圖動態加載標準的c++庫,爲了解決這個問題,我需要指定/MT選項,而不是/MD選項。這給我留下了很多問題:

  1. 這到底是什麼?
  2. /MD/MT相比有什麼好處?我的意思是,必須有一個原因,它是默認選項...
  3. 我該如何去尋找.dll並讓Visual Studio使用它?我下載了this,但老實說不知道如何使用它。
  4. 最重要的是,如何讓這個錯誤消失,我的程序運行?

一些額外的信息:我編譯Release模式使用x64版本。

+0

MSVCP110D.dll是一個來自Visual Studio 2012的調試DLL(除非2013也保留相同的dll)。 – drescherjm

+0

該項目最初是用VS2012構建的。爲什麼現在還在尋找? – MirroredFate

+1

由於調試DLL不可再發行,您不會在可再發行組件中找到此dll。 – drescherjm

回答

14

問題是,您正在通過使用使用不同編譯器編譯的Qt混合不同版本的Visual Studio。請記住,每個版本的Visual Studio都有自己的運行時/ CRT。使用Visual Studio 2012編譯的Qt dll將依賴於Visual Studio 2012運行時。他們不會使用2013運行時。

此問題的解決方案是用相同的編譯器重新編譯所有代碼和相關庫/ dll。

警告: 有些用戶會嘗試只安裝了動態運行時(或重新編譯使用靜態CRT依賴庫)從Visual Studio的其他版本然而,這不是一個解決這個問題,主要是因爲每個運行都有其擁有獨立的堆。分離堆可以並且會導致由於在一個堆中分配內存而導致隨機崩潰,然後嘗試將其釋放到不同的堆中。由於堆不共享有關分配或釋放的信息,因此會導致出現錯誤的堆棧。根據我的經驗,這個問題並不總是會造成瞬間崩潰。崩潰可能會或可能不會發生在下一次分配的損壞的堆上,因此調試這種情況可能會非常令人沮喪。

+2

+1有關衝突堆的評論。 – texnic