我正在使用VS2008开发COM dll,默认使用CRT版本9,但我正在使用不兼容新CRT的TSF(文本服务框架)。我认为解决方案是使用兼容的CRT版本,那么我该如何指定CRT版本?
我正在使用VS2008开发COM dll,默认使用CRT版本9,但我正在使用不兼容新CRT的TSF(文本服务框架)。我认为解决方案是使用兼容的CRT版本,那么我该如何指定CRT版本?
我完全赞同建议不要手动更改与之链接的 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。这里有个人已经这样做了。
这个解决方案对我在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需要匹配...这就发生在那个地方。
不要尝试使用VS9并链接到另一个版本的CRT。
如果您需要将应用程序链接到另一个CRT,比如VS8的CRT,则必须在该版本的VS中编译和链接您的应用程序。