如何强制 C++ 编译器使用特定的 CRT 版本?
-
06-09-2019 - |
题
我正在使用VS2008来开发com dll,默认情况下使用CRT版本9,但我使用的是与新CRT不兼容的TSF(文本服务框架)。我认为解决方案是使用兼容的那么我如何指定CRT版本?
解决方案
我整个尽情参加推荐的不可以手动更改您对链接的CRT的版本。但是,如果由于某种原因(我无法想象),这是你正确的行动当然,这样做的方式是改变的为您的项目清单。
首先确保清单是的不的每个构建生成(在VS2005:配置属性/链接器/清单文件/生成清单),因为它会覆盖您手动更改。另外,还要确保有没有隔离功能。 接下来,找到清单文件 - 应该在$(IntDir)(例如,调试)。你应该看到一个部分类似 -
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
(对于调试生成的,当然)。您需要编辑的版本和CRT元素的公钥属性。 你可以在当地的WINDOWS \ WinSxS文件夹检查文件,查看版本。检查 的如何提取公钥一旦你找到你想要的版本。 (虽然我第一次尝试,并直视其他项目的清单,链接对你的期望CRT版本)。
如果你去那里,指望一些粗糙的水。你可能有一些运气,如果你的应用程序是一个控制台应用程序,不针对其他并排端组件(MFC,OpenMP的,等等)联系起来。如果你的应用是不平凡的,如果没有一些复杂的版本依赖的入账金额的SxS组件我会感到惊讶。
其他提示
最简单的方法是使用与 TFS 兼容的 CRT 的 VC++ 版本构建 DLL。
我认为将 DLL 与不同版本的 CRT 链接不是一个好主意,除非您也使用相同版本的头文件。最简单的方法是使用正确的 VC++ 版本......
如果您仍想尝试,您可以:
- 转到“配置设置->链接器->输入->忽略特定库”并输入您正在使用的crt(libc.lib、libcmt.lib等)看到这个 代码项目文章 了解详情)。
- 在“配置设置->链接器->输入->附加依赖项”中输入要使用的crt版本的名称,在“配置设置->链接器->常规->附加库目录”中输入其路径。
您还可以尝试更改“工具->选项->项目和解决方案->VC++目录->库文件”中的默认目录。也许将 $(VCInstallDir)lib 更改为其他版本的 CRT 所在的路径即可解决问题
不要试图使用VS9并链接到CRT的另一个版本。
如果您需要在您的应用程序链接到另一个CRT,说VS8的CRT,那么你就必须编译与在该版本VS的链接您的应用程序。
在解决方案为我用Visual Studio Express的2013的x64 + OpenCV的2.4.9编译64位,调试(我集成在LV2013 64),但它应该对任何其他VS版本工作:
1)对您的解决方案右键单击>属性>调试源文件...
2)有也许两个entires(取决于您的VS-安装目录)... C:\ Program Files文件(x86)的\微软的Visual Studio 12.0 \ Common7 \ IDE \ VC7 \ atlmfc C:\程序文件(x86)\微软的Visual Studio 12.0 \ Common7 \ IDE \ VC7 \ CRT
使用这些它会工作的Visual Studio 2013快,但也应该对其他工作,2013年如果你已经有了Visual Studio的10或11只需输入“微软的Visual Studio 11.0”或在每个10.0。你也可以加入他们。
这些项下的解决方案,你可以从你的OpenCV.sln获取>属性>调试源文件(如上所述)。正如已经描述下:CRT需要匹配...这发生在那个地方