我在Visual Studio解决scheme中有两个项目。 一个构build一个静态的LIB,另一个构build一个dynamic的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正在做一个跳跃,因为我正在构build一个DLL(_USRDLL和_WINDLL被定义),我必须要dynamic运行时链接(/ MD或/ MDd,它定义_DLL)或DLL连接Boost。 这是不正确的,因为我特别要求静态链接(/ MT或/ MTd)。
我提交了一个针对Boost的错误报告 ,因为它的错误假设,但是这并不能帮助我使用这个库。 在报告中,Boost维护人员坚持认为,尽pipe事实certificate我不是,但Boost在至less30个文件中操纵它。 我在Boost邮件列表上find了一个答案 ,这个答案实质上是指改变我的项目设置以适应Boost。
更改为dynamic运行时链接(/ MD和/ MDd)不可行,因为出于安全性的考虑,静态链接被select(1),(2)另一个库使用静态链接。 这是不可谈判的 – 我们别无select。
总结清楚(TLDR):我想要使用静态链接的一切,而我的输出程序是一个DLL(不是一个静态的LIB,而不是一个EXE)。 一切都链接在DLL中静态。
有谁知道如何在Windows上使用这个库来build立一个静态链接的DLL?
这个问题确实是一个提升设置的错误。 由于一些未知的原因(我不能确定是合乎逻辑的,因为它没有效果)。 Boost Python将强制 boost的动态链接,而不管用户选项如何
简而言之,如果你的项目中有boost-python,boost错误地阻止boost与/ MT开关的静态连接。
通过在包含boost头文件之前定义BOOST_PYTHON_STATIC_LIB,可以轻松解决这个问题。
短版:听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是头文件,所以只要你没有链接到它的任何.lib文件,你应该没问题。 然而,我猜测“auto_link.hpp”只是由boost的部分使用.libs,可能性很好,你遇到它的开始意味着你想链接到一个Boost .lib。
更改为动态运行时链接(/ MD和/ MDd)不可行,因为出于安全性的考虑,静态链接被选择(1),(2)另一个库使用静态链接。
如果安全性是一个考虑因素,那么应该意识到这一点:事实上,构建DLL意味着您的应用程序可能对DLL注入开放,无论您如何链接到运行时。 所以我没有看到动态链接比静态链接更安全。