2009-08-20 112 views
0

我們有一個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添加到程序集中?如果是這樣,我該怎麼做?

回答

1

好的。如果你在VS 2008中打開第三方庫dll(確保它選擇了OpenWith> Resource Editor)它是否包含它自己的清單?

如果確實存在,或者即使不存在,也可以通過DependencyWalker查看此第三方庫試圖鏈接到哪個確切的運行時DLL。

它與VS2005的工作,而不是VS2008,意味着該dll想要使用VS2005運行時的releasemode版本的事實:MSVCR80.DLL

你提到msvc690.dll,不按門鈴與我:Visual Studio 6使用簡單命名爲msvcrt.dll - 第一版本的Visual Studio使用版本化的DLL運行時是VS 2003 NET或什麼:msvcrt7.dll

無論如何,如果第三方庫不包含自己的清單資源,那麼最簡單的做法是將相關程序集引用添加到應用程序清單。

有許多這樣做的方法 - 你可以創建一個清單fragement作爲一個XML文件,並將其添加到您的應用程序「配置屬性>清單工具>輸入和輸出>其他清單文件」

我找到在VS2008中合併附加的依賴程序集指令的最方便的方法是使用linkers/manifestdependency命令行選項。

如果添加以下代碼片段在你的項目中的文件,它會給鏈接必要的提示:

#define X_CRT_ASSEMBLY_VERSION "9.0.21022.8" 
#pragma comment(linker,"/manifestdependency:\"type='win32' "\ 
    "name='"Microsoft.VC80.CRT' " 
    "version='8.0.??.??' "       \ 
    "processorArchitecture='x86' "         \ 
    "publicKeyToken='????????'\"") 

的??的是那裏,因爲我不知道的版本號或VS2005庫的公鑰密碼。如果你能看到它們並填充它們,它應該游泳。

+0

Doh,我的意思是msvcr90.dll。 Tha第三方DLL不包含它自己的清單。如果我在Dep Walker中打開它,它對msvcr80.dll有依賴性。經過一些進一步的調查,我認爲這個第三方lib是一個紅鯡魚。看來我們的一個庫正在鏈接到調試和優化的CRT DLL。它恰好是依賴於第三方庫的lib,因此可能仍然是原因,但我必須仔細檢查項目設置才能確定。無論如何,感謝您的幫助,我可能會回來更多的問題。 – 2009-08-20 11:44:49

+0

我不得不在調試配置的項目設置中明確排除MSVCRT.lib,然後這一切似乎工作。我會將這個答案標記爲正確,因爲它似乎正確回答了我原來的問題。 – 2009-08-20 15:13:37

+0

除非第三方「dll」實際上是靜態庫,否則我必須承認解決方案沒有多大意義。如果他們是dll,他們應該對他們想要的哪個運行時DLL相當堅持。因爲第三方dll已經鏈接,所以更改應用程序鏈接器設置不應該改變這一點。 – 2009-08-20 15:33:53