2009-04-08 83 views
11

我正在使用VS2008開發一個默認使用CRT版本9 的COM DLL,但我使用的是與新CRT不兼容的TSF(文本服務框架)。我認爲解決方案是使用兼容的,所以我如何指定CRT版本?如何強制C++編譯器使用特定的CRT版本?

+0

查看上一個回答:http://stackoverflow.com/questions/693250/vs-2008-link-against-older-c-runtime – 2009-04-08 14:57:38

回答

10

我全心全意加入推薦而不是手動更改您鏈接的CRT版本。但是,如果出於某種原因(我無法想象),這對您來說是正確的行動方式,那麼您的項目需要更改manifest

首先確保清單是而不是在每個版本(在VS2005上:配置屬性/鏈接器/清單文件/生成清單)上生成,因爲它會覆蓋您的手動更改。還要確保啓用了隔離。 接下來,找到清單文件 - 應位於$(IntDir)(例如Debug)。您應該看到類似於 -

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 

(對於調試版本,當然)。您需要編輯CRT元素的版本和publicKeyToken屬性。 您可以檢查本地WINDOWS \ WinSxS文件夾中的文件以查看可用版本。檢查here一旦找到所需的版本,如何提取publicKeyToken。 (儘管我首先嚐試着直接看看其他項目的清單,並與您期望的CRT版本進行鏈接)。

如果你去那裏,期待一些粗糙的水。如果您的應用程序是不與其他並排組件(MFC,OpenMP等)鏈接的控制檯應用程序,那麼您可能會有一些運氣。如果你的應用程序不是微不足道的,如果SxS組件中沒有一些複雜的版本依賴關係,我會感到驚訝。

(編輯)您還需要向您的應用程序分發您正在使用的特定CRT。這是someone誰做的。

2

最簡單的方法是使用與TFS兼容的CRT的VC++版本構建您的DLL。

我不認爲只是將您的DLL鏈接到不同版本的CRT是一個好主意,除非您還使用相同版本的頭文件。而要做到這一點最簡單的方法將有權使用VC++版...

如果你還是想試試,您可以:

  • 去「配置設置 - >連接器 - >輸入 - >忽略特定庫「並輸入正在使用的crt(libc.lib,libcmt.lib等,詳情請參閱此code project article)。
  • 在「配置設置 - >鏈接器 - >常規 - >其他庫目錄」的「配置設置 - >鏈接器 - >輸入 - >其他依賴項」中輸入要使用的crt版本的名稱。

您也可以嘗試更改「工具 - >選項 - >項目和解決方案 - > VC++目錄 - >庫文件」中的默認目錄。也許改變$(VCInstallDir)lib到你其他版本的CRT所在的路徑將做詭計

0

不要嘗試使用VS9並鏈接到另一個版本的CRT。

如果你需要你的應用程序鏈接到另一個CRT,比如VS8的CRT,那麼你必須編譯&鏈接你的應用程序在該版本的VS.

+0

什麼是你不能鏈接到你選擇的CRT的確切原因?你能詳細說明一下嗎? – 2011-02-26 20:38:29

0

的解決方案爲我用Visual Studio Express的2013的x64 + OpenCV的2.4.9編譯64位,調試(我集成在LV2013 64),但它應該對任何其他VS版本工作:

1)右鍵單擊您的解決方案>屬性>調試源文件...

2)有可能有兩個條目(取決於您的VS安裝目錄)... C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ vc7 \ atlmfc C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ vc7 \ crt

有了這些,它將適用於Visual Studio 2013 Express,但也應該適用於其他2013.如果您有Visual Studio 10或11,則只需在每個中鍵入「Microsoft Visual Studio 11.0」或10.0。你也可以添加它們。

這些條目可以從解決方案>屬性>調試源文件(如上所述)從OpenCV.sln獲得。正如已經描述的那樣:CRT需要匹配...並且這發生在那個地方。

相關問題