如何强制C++编译器使用特定的CRT版本?

问题描述:

我正在使用VS2008开发一个默认使用CRT版本9 的COM DLL,但我使用的是与新CRT不兼容的TSF(文本服务框架)。我认为解决方案是使用兼容的,所以我如何指定CRT版本?如何强制C++编译器使用特定的CRT版本?

+0

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

我全心全意加入推荐而不是手动更改您链接的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谁做的。

最简单的方法是使用与TFS兼容的CRT的VC++版本构建您的DLL。

我不认为只是将您的DLL链接到不同版本的CRT是一个好主意,除非您还使用相同版本的头文件。而要做到这一点最简单的方法将有权使用VC++版...

如果你还是想试试,您可以:

  • 去“配置设置 - >连接器 - >输入 - >忽略特定库“并输入正在使用的crt(libc.lib,libcmt.lib等,详情请参阅此code project article)。
  • 在“配置设置 - >链接器 - >常规 - >其他库目录”的“配置设置 - >链接器 - >输入 - >其他依赖项”中输入要使用的crt版本的名称。

您也可以尝试更改“工具 - >选项 - >项目和解决方案 - > VC++目录 - >库文件”中的默认目录。也许改变$(VCInstallDir)lib到你其他版本的CRT所在的路径将做诡计

不要尝试使用VS9并链接到另一个版本的CRT。

如果你需要你的应用程序链接到另一个CRT,比如VS8的CRT,那么你必须编译&链接你的应用程序在该版本的VS.

+0

什么是你不能链接到你选择的CRT的确切原因?你能详细说明一下吗? – 2011-02-26 20:38:29

的解决方案为我用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需要匹配...并且这发生在那个地方。