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


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


2602
2018-04-08 13:56


起源

见上一个答案: stackoverflow.com/questions/693250/... - i_am_jorf


答案:


我衷心地加入了这个建议  手动更改链接的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元素的version和publicKeyToken属性。 您可以检查本地WINDOWS \ WinSxS文件夹中的文件以查看可用的版本。检查 这里 一旦找到所需的版本,如何解压缩publicKeyToken。 (虽然我首先尝试直接查看其他项目的清单,并链接到您想要的CRT版本)。

如果你去那里,期待一些粗糙的水。如果您的应用程序是一个不与其他并排组件(MFC,OpenMP等)链接的控制台应用程序,那么您可能会有一些运气。如果您的应用程序非常重要,那么如果SxS组件没有复杂的版本依赖性,我会感到惊讶。

(编辑)您还需要在应用程序中分发您正在使用的特定CRT。这里的 有人 谁做的。


10
2018-04-12 09:53





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

我认为将DLL与不同版本的CRT链接起来并不是一个好主意,除非您也使用相同版本的头文件。最简单的方法是使用正确的VC ++版本......

如果您还想尝试,可以:

  • 转到“配置设置 - >链接器 - >输入 - >忽略特定库”并输入您正在使用的crt(libc.lib,libcmt.lib等。 代码项目文章 详情)。
  • 在“配置设置 - >链接器 - >输入 - >附加依赖项”中输入要使用的crt版本的名称,并在“配置设置 - >链接器 - >常规 - >附加库目录”中输入其路径。

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


2
2018-04-08 15:03





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

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


0
2018-04-08 16:10



您无法链接到您选择的CRT的原因是什么?你能详细说说吗? - Piotr Dobrogost


该解决方案适用于我使用Visual Studio Express 2013 x64 + OpenCV 2.4.9 x64编译,调试(我在LV2013 x64中集成),但它应该适用于任何其他VS版本:

1)右键单击解决方案>属性>调试源文件...

2)可能有两个entires(取决于你的VS-install-directory)...... 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
2017-10-10 11:04