c++ - "Mixing a dll boost library with a static runtime is a really bad idea..."

标签 c++ windows visual-c++ boost dll

我在 Visual Studio 解决方案中有两个项目。一个构建静态 LIB,另一个构建动态 DLL。两者都使用静态运行时链接(/MT 和/MTd),并且都使用 Boost。 Boost 不是我的决定 - 我想放弃它,但我被委员会否决了。

LIB 构建良好,但 DLL 从 auto_link.hpp(第 354 行)中发出错误:“将 dll boost 库与静态运行时混合是一个非常糟糕的主意......”。

#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
#  define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#  error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#  define BOOST_LIB_PREFIX "lib"
#endif

我没有定义 BOOST_DYN_LINK。似乎 Boost 正在取得飞跃,因为我正在构建一个 DLL(定义了 _USRDLL 和 _WINDLL),我必须想要动态运行时链接(/MD 或/MDd,它定义了 _DLL)或针对 Boost 的 DLL 链接。这是不正确的,因为我特别要求静态链接(/MT 或/MTd)。

我提交了一份 bug report反对 Boost 的错误假设,但这对我使用该库没有帮助。在报告中,Boost 维护者坚持认为是我设置的(尽管审计显示我不是;并且 Boost 在至少 30 个文件中对其进行了操作)。我找到了 one answer在 Boost 邮件列表上,它基本上声明要更改我的项目设置以适应 Boost。

更改为动态运行时链接(/MD 和/MDd)是不可行的,因为选择静态链接 (1) 出于安全考虑,以及 (2) 另一个库使用静态链接。这是没有商量余地的——我们别无选择。

为清楚起见总结一下(TLDR):我想对所有内容使用静态链接,而我的输出程序是一个 DLL(不是静态 LIB,也不是 EXE)。一切都在 DLL 中静态链接。

有谁知道如何在 Windows 上使用这个库来构建带有静态链接的 DLL?

最佳答案

简短版本:听听 Boost ML 上的人。 Boost 不支持你正在尝试做的事情,无论如何这是一个坏主意。最好接受这一点并让其他库使用动态运行时。

更长的版本:

您似乎误解了 Boost 告诉您的内容。您正在尝试解析 Boost 源代码,而不是仅仅阅读它的内容:

auto_link.hpp (line 354): "Mixing a dll boost library with a static runtime is a really bad idea...".

Boost 认为您正在构建 DLL,同时静态链接到运行时库。这正是你在做什么; Boost 已准确检测到您正在尝试执行的操作。

你的问题是 Boost 库不支持被构建到一个没有动态链接到运行时库的 DLL 中。原因是这是“一个非常糟糕的主意”。因此他们会检查您是否正在尝试这样做,并通过一条错误消息提醒您这一事实来停止您的构建。

Boost 的“freetards”不知道如何让某些东西“开箱即用”,从而阻止了这种情况,因为静态链接到 DLL 中的运行时通常是用户的错误。它要么是意外造成的,要么是由于忽视了这可能造成的主要问题。

如果静态链接到运行时,每个 DLL/exe 都会有自己的运行时拷贝,以及自己的全局变量。由于 heap 是通过全局变量管理的,这意味着每个 DLL/exe 都有自己的堆。因此,如果您尝试释放在另一个地址空间中分配的内存……繁荣。如果您不小心,这比您想象的要容易得多。

这也可能导致其他问题。 “freetards”试图阻止你搬起石头砸自己的脚。但很明显,您比“将他们的废话强加给诚实和毫无戒心的用户”更清楚,他们可能希望在他们即将驶过悬崖时得到建议。

现在,您可以简单地删除错误消息。 Boost 的大部分是 header ,所以只要您实际上没有链接到它的任何 .lib,就应该没问题。但是,我猜想“auto_link.hpp”仅由 Boost 的 .lib 部分使用,很有可能您一开始就遇到它意味着您正在尝试链接到 Boost .lib。

Changing to Dynamic Runtime Linking (/MD and /MDd) is not feasible since static linking was chosen (1) due to security considerations, and (2) another library uses static linking.

如果安全是一个考虑因素,您应该意识到这一点:您正在构建 DLL 这一事实意味着您的应用程序可能对 DLL 注入(inject)开放,无论您如何链​​接到运行时。所以我看不出动态链接比静态链接安全得多。

关于c++ - "Mixing a dll boost library with a static runtime is a really bad idea...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527713/

相关文章:

c++ - 为什么指向 NULL 字符的指针未转换为 false

windows - 如何在 Windows 上安装 mongoDB?

c++ - 不可复制的对象和值初始化 : g++ vs msvc

windows - 如何在VC++ 6.0 转换的VC++ 2010 项目中使用iFileDialog?

c++ - 是否有某种功能,指针取消引用给出右值?

c++ - 具有不同原型(prototype)的函数指针 vector ,我可以构建一个吗?

c++ - 大多维 vector 初始化C++

java - Windows 保留名称 "c​on"解决方法/hack

windows - 如何获得 quickfix 以在先前聚焦的窗口中打开结果?

c++ - 关于阈值技术/图像二值化的建议