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

11

我正在使用VS2008开发COM dll,默认使用CRT版本9,但我正在使用不兼容新CRT的TSF(文本服务框架)。我认为解决方案是使用兼容的CRT版本,那么我该如何指定CRT版本?


请参阅之前的答案:https://dev59.com/AkfRa4cB1Zd3GeqP5gn8 - i_am_jorf
4个回答

10

我完全赞同建议不要手动更改与之链接的 CRT 版本。但是,如果出于某些原因(我无法想象),这是您正确的操作方式,那么做法是更改项目的清单文件

首先确保不会在每次构建时生成清单文件(在 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文件夹中的文件以查看可用版本。在找到所需版本后,请参阅此处了解如何提取publicKeyToken。(尽管我会首先尝试直接查看使用所需CRT版本的其他项目清单)。

如果您确实前往那里,请准备好遇到困难。如果您的应用程序是不链接其他Side-by-Side组件(MFC、OpenMP等)的控制台应用程序,那么您可能会有些运气。如果您的应用程序比较复杂,我会惊讶于SxS组件之间没有一些复杂的版本依赖关系。

(编辑)您还需要与您的应用程序一起分发您正在使用的特定CRT。这里有个人已经这样做了。


2
最简单的方法是使用与TFS兼容的CRT构建您的DLL的VC++版本。
我认为仅链接不同版本的CRT并不是一个好主意,除非您还使用相同版本的头文件。而最简单的方法是使用正确的VC++版本...
如果您仍然想尝试,可以:
  • 转到“配置设置->链接器->输入->忽略特定库”,并输入您正在使用的crt(libc.lib、libcmt.lib等,请参见此代码项目文章以获取详细信息)。
  • 在“配置设置->链接器->输入->附加依赖项”中输入要使用的crt版本的名称,并在“配置设置->链接器->常规->附加库目录”中输入其路径。
您也可以尝试在“工具->选项->项目和解决方案->VC++目录->库文件”中更改默认目录。也许将$(VCInstallDir)lib更改为CRT的其他版本所在的路径就可以解决问题了。

0

这个解决方案对我在Visual Studio Express 2013 x64 + OpenCV 2.4.9 x64编译和调试(我将其集成到LV2013 x64中)有效,但它也适用于其他任何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需要匹配...这就发生在那个地方。


0

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

如果您需要将应用程序链接到另一个CRT,比如VS8的CRT,则必须在该版本的VS中编译和链接您的应用程序。


你不能链接到你选择的CRT的确切原因是什么?你能详细说明一下吗? - Piotr Dobrogost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接