11

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

4

4 回答 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 元素的 version 和 publicKeyToken 属性。您可以检查本地 WINDOWS\WinSxS 文件夹中的文件以查看可用的版本。找到所需版本后,请在此处查看如何提取 publicKeyToken。(虽然我会首先尝试直接查看其他项目的清单,链接到您想要的 CRT 版本)。

如果你去那里,期待一些汹涌的水。如果您的应用程序是不与其他并排组件(MFC、OpenMP 等)链接的控制台应用程序,您可能会走运一些。如果您的应用程序不平凡,如果 SxS 组件中没有一些复杂的版本依赖关系,我会感到惊讶。

(编辑)您还需要与您的应用程序一起分发您正在使用的特定 CRT。这是这样做的

于 2009-04-12T09:53:03.887 回答
2

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

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

如果您仍想尝试,您可以:

  • 进入“Configuration settings->Linker->Input->Ignore specific library”,输入你正在使用的crt(libc.lib、libcmt.lib等,详见此代码项目文章)。
  • 在“配置设置->链接器->输入->附加依赖项”中输入要使用的crt版本名称,在“配置设置->链接器->常规->附加库目录”中输入其路径。

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

于 2009-04-08T15:03:20.487 回答
0

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

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

于 2009-04-08T16:10:18.767 回答
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 需要匹配……而这发生在那个地方。

于 2014-10-10T11:04:32.780 回答