我們有一個C++應用程序,我最近從Linux/gcc移植到Visual Studio 2005的Windows上構建。該應用程序使用僅提供使用優化的CRT DLL的DLL的第三方庫(即它們不提供鏈接到調試CRT DLL的等價物)。對於VS2005來說,這似乎不成問題=調試版本在System32目錄中找到優化的CRT DLL。調試構建應用程序定位發佈CRT程序集
我現在試圖用VS2008構建和運行我們的應用程序,並且調試版本無法運行,因爲它找不到優化的CRT DLL(msvc690.dll)。 VC9 CRT DLLs在GUID風格名稱的目錄中被鬆動 - 我相信這是一個並排的程序集,應用程序應該使用應用程序的清單來定位它。但是,這種被建立並嵌入到應用程序exe文件清單僅指定調試CRT裝配:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
我不是一個Windows專家(沒有任何更多,至少),所以這是所有新的給我。這裏有什麼正確的解決方案?我是否需要告訴清單編譯器將優化的CRT DLL添加到程序集中?如果是這樣,我該怎麼做?
Doh,我的意思是msvcr90.dll。 Tha第三方DLL不包含它自己的清單。如果我在Dep Walker中打開它,它對msvcr80.dll有依賴性。經過一些進一步的調查,我認爲這個第三方lib是一個紅鯡魚。看來我們的一個庫正在鏈接到調試和優化的CRT DLL。它恰好是依賴於第三方庫的lib,因此可能仍然是原因,但我必須仔細檢查項目設置才能確定。無論如何,感謝您的幫助,我可能會回來更多的問題。 – 2009-08-20 11:44:49
我不得不在調試配置的項目設置中明確排除MSVCRT.lib,然後這一切似乎工作。我會將這個答案標記爲正確,因爲它似乎正確回答了我原來的問題。 – 2009-08-20 15:13:37
除非第三方「dll」實際上是靜態庫,否則我必須承認解決方案沒有多大意義。如果他們是dll,他們應該對他們想要的哪個運行時DLL相當堅持。因爲第三方dll已經鏈接,所以更改應用程序鏈接器設置不應該改變這一點。 – 2009-08-20 15:33:53