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

时间:2009-04-08 13:56:05

标签: c++ visual-studio-2008 visual-c++ msvcrt

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

4 个答案:

答案 0 :(得分: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元素的version和publicKeyToken属性。 您可以检查本地WINDOWS \ WinSxS文件夹中的文件以查看可用的版本。找到所需的版本后,检查here如何解压缩publicKeyToken。 (虽然我首先尝试直接查看其他项目的清单,并链接到您想要的CRT版本)。

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

(编辑)您还需要在应用程序中分发您正在使用的特定CRT。这是someone谁做到了。

答案 1 :(得分:2)

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

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

如果您还想尝试,可以:

  • 转到“配置设置 - &gt;链接器 - &gt;输入 - &gt;忽略特定库”并输入您正在使用的crt(libc.lib,libcmt.lib等,请参阅此code project article了解详细信息)。
  • 在“配置设置 - >链接器 - >输入 - >附加依赖关系”中输入要使用的crt版本的名称,并在“配置设置 - >链接器 - &gt;通用 - >中输入其路径;其他库目录“。

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

答案 2 :(得分:0)

请勿尝试使用VS9并链接到其他版本的CRT。

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

答案 3 :(得分:0)

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

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

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。您也可以添加它们。

您可以在解决方案&gt;下从OpenCV.sln获取这些条目。属性&gt;调试源文件(如上所述)。正如已经描述的那样:CRT需要匹配......而这发生在那个地方。