如何构建面向特定可视C++可再发行版本的视觉C++项目
How to buid a Visual C++ project targeted to a specific Visual C++ Redistributable version
我有一个C++原生库,我正在使用Visual Studio 2005构建它,这是一个更大项目的一部分。
该项目通常包含其他几个dll,包括Microft C++可再发行组件包库(例如msvcr80.dll)。这样,我们可以部署我们的项目,而无需让用户安装 Microsoft Visual C++ 可再发行组件包 2005。
问题是,每当我将我的库放入这个更大的项目中时,我都会收到以下错误:
This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.
为了解决这个问题,我已经查看了我的dll正在使用哪个版本的Visual Studio CRT,以及较大的项目正在使用哪个版本的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>
但是现在我的库是在没有标签的情况下生成的。
最后请注意,我非常喜欢是否可以使用第一种方法,因为它更简单并且可以直接进入代码,这样我就不必一直记住为我的项目维护一个单独的清单文件。
然而,这是一个高度受控的环境
这就是问题所在,该计算机尚未收到 CRT 的最新安全更新。 如果该计算机也是安装程序的创建者,那么您肯定会遇到您所描述的问题,您正在请求计算机上不可用的DLL版本。
将文件部署到具有已知安全问题的用户计算机上绝对是一种需要审查的策略。 定义_CRT_ASSEMBLY_VERSION宏是正确的方法,但请考虑在项目设置中设置该宏而不是源文件,以便您可以绝对确定它是在 vc/include/crtassem.h #included 之前设置的。 项目 + 属性、C/C++、预处理器、预处理器定义设置。
是的,当然在你的所有项目中。
- 可视化 如何在 c++ 中制作特定大小的文件?
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 提升如何在图形可视化中写入边缘的权重?
- 如何在大型c++项目的可视化代码中设置调试
- 可视化编译与 C++ 中的 Extern 变量
- 可视化 Bazel C++预编译标头实现
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- C++合并排序可视化工具
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- 可视化 将字符串解析为数组以进行C++
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 可视化C++载体:未使用的容量
- 可视化 如何在 c++ 中截断
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- OpenCV 中大量可视化::Widget3D 的性能不佳
- GCC、CLANG 和 MSVC 的可视化C++自动矢量化要求
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 图形可视化作为窗口中的库