C++ &引用;将dll boost库与静态运行时混合使用是一个非常糟糕的主意……”;

C++ &引用;将dll boost库与静态运行时混合使用是一个非常糟糕的主意……”;,c++,windows,visual-c++,boost,dll,C++,Windows,Visual C++,Boost,Dll,我在VisualStudio解决方案中有两个项目。一个构建静态库,另一个构建动态DLL。两者都使用静态运行时链接(/MT和/MTd),并且都使用Boost。Boost不是我的决定——我想放弃它,但被委员会否决了 LIB构建得很好,但是DLL从auto_link.hpp(第354行)中发现了一个错误:“将DLL boost库与静态运行时混合使用是一个非常糟糕的主意……” 我没有定义BOOST\u DYN\u链接。Boost似乎是一个飞跃,因为我正在构建一个DLL(_USRDLL和_windl都已定

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

LIB构建得很好,但是DLL从auto_link.hpp(第354行)中发现了一个错误:“将DLL boost库与静态运行时混合使用是一个非常糟糕的主意……”

我没有定义BOOST\u DYN\u链接。Boost似乎是一个飞跃,因为我正在构建一个DLL(_USRDLL和_windl都已定义),所以我必须要动态运行时链接(/MD或/MDd,它定义了_DLL)或针对Boost的DLL链接。这是不正确的,因为我特别要求静态链接(/MT或/MTd)

我对Boost的错误假设提出了异议,但这无助于我使用该库。在报告中,Boost维护人员坚持认为我正在设置它(尽管审计显示我没有设置;Boost在至少30个文件中操纵它)。我在Boost邮件列表中找到了它,它本质上说明了更改我的项目设置以适应Boost

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

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


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

简短版本:听听Boost ML上的人说的话。Boost不支持您正在尝试的操作,而且这是个坏主意。最好接受这一点,并让其他库使用动态运行时

较长版本:

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

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


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

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

Boost的“Freetard”不知道如何“开箱即用”地工作,他们阻止了这一点,因为静态链接到DLL中的运行时通常是用户的错误。这不是偶然的,就是由于忽视了可能产生的主要问题

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

这也会导致其他问题。“自由人”试图阻止你射中自己的脚。但很明显,你知道最好不要“把他们的废话强加于诚实和毫无戒心的用户”,他们可能希望在他们即将驶过悬崖时得到建议

现在,您可以简单地删除错误消息。Boost的大部分内容都是头文件,所以只要您没有实际链接到它的任何.lib,您就可以了。然而,我猜“auto_link.hpp”只被Boost的.libs部分使用,很有可能您一开始就遇到了它,这意味着您正在尝试链接到Boost.lib

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


如果安全性是一个考虑因素,那么您应该意识到这一点:构建DLL的事实本身就意味着您的应用程序可能会接受DLL注入,而不管您如何链接到运行时。因此,我不认为动态链接比静态链接更不安全。

这个问题确实是boosts设置的一个错误。 出于某种未知的原因(我无法确定是否合乎逻辑——因为它没有效果)。Boost Python将强制动态链接Boost,而不管用户选项如何

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


通过在包含BOOST头文件之前定义BOOST_PYTHON_STATIC_LIB,可以很容易地解决这个问题。

我不知道它到底是如何影响构建的,但是使用
-DCMAKE_build_TYPE=Relase运行cmake会有所帮助。这里提到的一个标志可能是默认的发布标志。

您能从auto_link.hpp中删除有问题的检查吗?或者在包含auto_link.hpp之前加入#undef(未定义)USRDLL和_windle(未定义)USRDLL和(未定义)USRDLL和(未定义)windle(未定义)USRDLL和(未定义。我们有一个针对静态CRT和静态boost构建的DLL,没有错误/警告。如果到时候没有人回答,我明天会检查它。应该注意的是,构建一个静态链接到C运行库的DLL是非常危险的。这意味着在一个DLL中分配的内存不能在另一个DLL中直接释放。这听起来可能不会发生,但它可以。你会从中得到随机崩溃。这不仅仅适用于静态CRT。如果使用以前使用过的DLL,您也会遇到同样的问题
#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