我有一个 C++ 本机库,我正在使用 Visual Studio 2005 构建它,它是一个更大项目的一部分。
该项目通常包含其他几个 dll,包括 Microft C++ Redistributable Package 库(例如 msvcr80.dll)。这样我们就可以部署我们的项目,而无需让用户安装 Microsoft Visual C++ Redistributable Package 2005。
问题是,每当我将我的库放入这个更大的项目中时,我都会收到以下错误:
This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.
为了解决这个问题,我查看了我的 dll 使用的是哪个版本的 Visual Studio CRT,以及较大的项目使用的是哪个版本,结果发现它们是不同的。
以下是较大项目的清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>
这是我从图书馆得到的:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
然后我在网上做了一些研究,发现至少有两种方法可以手动更改我的 dll 的 CRT 版本。
第一个是在我的项目中设置以下宏:
#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"
第二个在这篇文章中有详细说明。
我已经尝试了这两种方法,但都没有奏效。
至于第一个,我已将 _CRT_ASSEMBLY_VERSION 添加到我项目的一个头文件中,但它并没有更改其 CRT 版本。另外,如果我有多个项目,是否必须将这个宏添加到所有项目中?
至于第二个,我将图书馆的清单更改为:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
但是现在我的库正在生成,里面没有标签。
最后请注意,如果我可以使用第一种方法,我非常喜欢,因为它更简单并且可以直接进入代码,这样我就不必记住为我的项目维护一个单独的清单文件。