使用宏_BIND_TO_CURRENT_VCLIBS_VERSION会有任何副作用吗?

13

我们正在将一个VC++项目从Visual Studio 2003迁移到Visual Studio 2008 SP1(9.0.30729.4148)。相关的外部依赖库也是用Visual Studio 2008 SP1编译的。

MainApp - Main application Compiled with VS SP1 9.0.30729.4148
ExtStaticLib1 - External static library compiled with VS  SP1 9.0.30729.4148
ExtDynamicDll1 - External DLL compiled with VS  SP1 9.0.30729.4148

主应用程序有两种部署情况:

  • 具有用户管理员权限的计算机: 我们建议在使用应用程序MainApp之前先安装Visual Studio可再发行包的先决条件。由于用户具有管理员权限,因此安装可再发行包没有问题。应用程序会自动链接到WinSxS文件夹中的VC redist DLL。
  • 非管理员用户的计算机: 这种情况存在问题。用户没有管理员权限,因此不可能安装VS2008SP1可再发行包。

我们正在采取以下措施解决这个问题:

  • 针对MainApp的目标使用宏_BIND_TO_CURRENT_OPENMP_VERSION进行编译(适用于MainApp中所有项目)。

  • 分发VS2008SP1可再发行DLL作为私有程序集,并将它们复制到应用程序安装目录中。

问题:

  1. 使用标志_BIND_TO_CURRENT_VCLIBS_VERSION是否有任何副作用(特别是当VC可再发行包和私有VC redist程序集同时存在时)?
  2. 我们无法控制外部库ExtStaticLib1、ExtDynamicDll1,并且它们不会使用宏_BIND_TO_CURRENT_OPENMP_VERSION进行编译。但它们已经使用VSSp1编译。这种设置会有任何问题吗?
  3. 如果有新版本的VS可再发行包可用(新于9.0.30729.4248),是否会出现问题?

谢谢。

2个回答

2
我会避免使用任何BIND宏。你迟早会遇到麻烦。
即使你将VC运行时DLL作为私有程序集分发,也不能确定用户没有已经安装了其他应用程序中的这些DLL。
一个问题是你可能会得到一个引用多个C运行时版本的清单。这里有一个关于此问题的公开问题(FYI:我也遇到了同样的问题!)。
所以,如果没有理由强制你只使用非常特定版本的C运行时而不是最新的兼容版本,则不要使用这些定义宏!

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接