简短版本:听听 Boost ML 上的人的意见。 Boost 不支持你想要做的事情,而且无论如何这都是一个坏主意。最好接受这一点并使其他库使用动态运行时。
更长的版本:
您似乎误解了 Boost 告诉您的内容。您尝试解析 Boost 源代码,而不是仅仅阅读它的内容:
auto_link.hpp(第 354 行):“将 dll boost 库与静态运行时混合是一个非常糟糕的主意......”。
Boost 认为您正在构建 DLL,同时静态链接到运行时库。这正是你正在做的事情; Boost 已准确地检测到您正在尝试执行的操作。
你的问题是 Boost 库没有support被构建到不动态链接到运行时库的 DLL 中。原因是这是“一个非常糟糕的主意”。因此,他们会检查您是否正在尝试这样做,并通过一条错误消息来停止您的构建,提醒您这一事实。
Boost 中的“freetards”不知道如何使某些东西“开箱即用”地工作,因此阻止了这种情况,因为静态链接到 DLL 中的运行时通常是用户的错误。它要么是偶然造成的,要么是由于对这可能产生的主要问题的无知而造成的。
如果静态链接到运行时,每个 DLL/exe 将拥有自己的运行时副本,以及自己的全局变量。并且自从heap通过全局变量进行管理,这意味着每个 DLL/exe 将有自己的堆。因此,如果您尝试释放在另一个地址空间中分配的内存......繁荣。如果你不小心的话,这比你想象的要容易得多。
这也可能导致其他问题。 “自由主义者”试图阻止你搬起石头砸自己的脚。但显然你知道最好不要“把他们的废话强加给诚实和毫无戒心的用户”,他们可能希望在即将驶下悬崖时得到建议。
现在,您可以简单地删除错误消息。 Boost 的大部分内容都是标头,因此只要您实际上没有链接到其任何 .lib,就应该没问题。但是,我猜想“auto_link.hpp”仅由 Boost 的 .lib 部分使用,您一开始遇到它的事实很可能意味着您正在尝试链接到 Boost .lib。
更改为动态运行时链接(/MD 和 /MDd)是不可行的,因为选择静态链接(1)出于安全考虑,并且(2)另一个库使用静态链接。
如果考虑安全性,您应该意识到这一点:您正在构建 DLL 这一事实意味着您的应用程序可能对 DLL 注入开放,无论您如何链接到运行时。所以我不认为动态链接比静态链接更不安全。