"将dll boost库与静态运行时混合是一个非常糟糕的主意......"

jww*_*jww 8 c++ windows dll boost visual-c++

我在Visual Studio解决方案中有两个项目.一个构建静态LIB,另一个构建动态DLL.两者都使用静态运行时链接(/ MT和/ MTd),并且都使用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
Run Code Online (Sandbox Code Playgroud)

我没有定义BOOST_DYN_LINK.看起来Boost正在实现一个飞跃,因为我正在构建一个DLL(定义了_USRDLL和_​​WINDLL),我必须要动态运行时链接(/ MD或/ MDd,定义_DLL)或DLL链接到Boost.这是不正确的,因为我特别要求静态链接(/ MT或/ MTd).

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

由于安全考虑因素选择了静态链接(1),并且(2)另一个库使用静态链接,因此更改为动态运行时链接(/ MD和/ MDd)是不可行的.这是不容谈判的 - 我们别无选择.

总结清晰(TLDR):我想对所有东西使用静态链接,而我的输出程序是D​​LL(不是静态LIB,不是EXE).DLL中的所有内容都是静态链接的.

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

Nic*_*las 32

简短版:听Boost ML上的人.Boost不支持你想要做的事情,无论如何这都是一个坏主意.最好接受并使其他库使用动态运行时.

更长的版本:

你似乎误解了Boost告诉你的事情.您正在尝试解析Boost源代码而不是仅仅阅读它所说的内容:

auto_link.hpp(第354行):"将dll boost库与静态运行时混合是一个非常糟糕的主意......".

Boost认为您正在构建DLL,同时静态链接到运行时库.这正是你正在做的事情; Boost准确地检测到了您要做的事情.

您的问题是Boost库不支持内置到不动态链接到运行时库的DLL中.原因在于它是"一个非常糟糕的主意".因此,他们检查您是否正在尝试这样做并停止构建,并显示一条错误消息,提醒您注意这一事实.

Boost中的"freetards"不知道如何使某些东西"开箱即用"可以防止这种情况,因为在DLL中静态链接到运行时通常是用户的错误.它可能是偶然发生的,也可能是由于忽视了这可能造成的主要问题.

如果您静态链接到运行时,每个DLL/exe将拥有自己的运行时副本,以及它们自己的全局变量.由于是通过全局变量管理的,这意味着每个DLL/exe都有自己的堆.因此,如果你试图释放在另一个地址空间分配的内存......繁荣.如果你不小心,这比你想象的容易得多.

这也可能导致其他问题."freetards"试图阻止你在脚下射击自己.但显然你知道的最好是"强迫他们对诚实和毫无戒心的用户说谎",他们可能希望在他们即将驾驶悬崖时被告知.

现在,您只需删除错误消息即可.大多数Boost都是标题,所以只要你没有实际链接到它的任何.libs,你应该没问题.但是,我猜"auto_link.hpp"仅用于Boost的.libs部分,你开始时遇到的事实很有可能意味着你试图链接到Boost .lib.

由于安全考虑因素选择了静态链接(1),并且(2)另一个库使用静态链接,因此更改为动态运行时链接(/ MD和/ MDd)是不可行的.

如果考虑安全性,您应该意识到这一点:您正在构建DLL的事实意味着您的应用程序可能对DLL注入开放,无论您如何链​​接到运行时.所以我没有看到动态链接的安全性如何不如静态.

  • @noloader,如果一个DLL是Boost的首选,我不明白为什么它不是C运行时库的首选.你坚持自己选择的设置,让自己陷入失败之中 - 事情将会出现*繁荣*,因为没有可解释的原因.这就是错误试图告诉你的. (2认同)

Joh*_*man 10

这个问题确实是增强设置的错误.由于一些未知的原因(我无法确定是合乎逻辑的 - 因为它没有效果).无论用户选择如何, Boost Python都会强制动态链接boost

简而言之,如果你的项目中有boost-python,则boost会错误地阻止boost与/ MT开关的静态链接.

通过在包含boost头之前定义BOOST_PYTHON_STATIC_LIB,可以轻松解决此问题.

  • 我将接受这一点以帮助未来的访问者,因为这似乎是一个合理的答案。但是对未来的访问者的警告:我无法对其进行测试。 (2认同)