2012-06-18 58 views
0

我有一個C++本機庫,使用Visual Studio 2005構建,這是大型項目的一部分。如何構建一個針對特定Visual C++可再發行版本的Visual C++項目

該項目通常包含其他幾個DLL,包括Microft C++可再發行組件包庫(例如msvcr80.dll)。這樣我們就可以無需部署我們的項目,使用戶安裝Microsoft Visual C++可再發行組件包2005

的問題是,每當我把我的圖書館到這個大項目中,我得到以下錯誤:

This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem. 

爲了解決這個問題,我查看了我的dll使用的是哪個版本的Visual Studio CRT,以及哪個版本的大型項目正在使用它,結果證明它們是不同的。

下面是較大的項目清單:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <noInheritable></noInheritable> 
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
</assembly> 

這是我從我的圖書館有:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
</dependency> 

我那麼做了網絡上的一些研究,至少發現了兩種手動更改我的dll的CRT版本的方法。

第一種是設置下面的宏在我的項目:

#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053" 

,第二個是在這個post詳細。

我已經嘗試了他們兩個,但都沒有工作。

至於第一個,我已經添加了_CRT_ASSEMBLY_VERSION到我的項目的頭文件之一,但它沒有改變它的CRT版本。另外,如果我有多個項目,我是否必須將這個宏添加到所有項目中?

至於第二個我已經改變了我的圖書館艙單:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
     </dependentAssembly> 
    </dependency> 
</assembly> 

但現在被無它裏面的標籤生成我的圖書館。

最後請注意,我非常喜歡如果我可以使用第一種方法,因爲它更簡單,並且是直接進入代碼的東西,這樣我就不必一直記住爲我維護單獨的清單文件項目。

+0

您是否安裝了2005 SP1?如何建設大型項目? – Joe

+0

你必須使用2005嗎? – stanri

+0

嗨,是的,我的機器上安裝了2005 SP1。我還想過在構建主要大型項目的同一臺機器上構建我的項目,但這是一個高度受控的環境,我不可能在那裏安裝項目所需的依賴項。所以,現在,我必須讓所有的東西都適用於我現在的機器。 – Felipe

回答

0

however that is a highly controlled environment

這是問題所在,該機器還沒有收到CRT的最新安全更新。如果那臺機器也是安裝程序的創始者,那麼你肯定會遇到你所描述的問題,你需要一個在機器上不可用的DLL版本。

將文件部署到具有已知安全問題的用戶機器當然是一種需要審查的策略。定義_CRT_ASSEMBLY_VERSION宏是正確的方法,但是可以考慮在項目設置中而不是源文件中設置該宏,以便可以確保在vc/include/crtassem.h獲得#included之前設置該宏。項目+屬性,C/C++,預處理器,預處理器定義設置。

是的,當然在全部您的項目。

相關問題