【发布时间】:2012-03-20 15:02:24
【问题描述】:
我在 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)。
我针对 Boost 的错误假设提交了bug report,但这对我使用该库没有帮助。在报告中,Boost 维护者坚持认为我正在设置它(尽管审计表明我不是;并且 Boost 在至少 30 个文件中操纵它)。我在 Boost 邮件列表中找到了one answer,它实质上声明要更改我的项目设置以适应 Boost。
更改为动态运行时链接(/MD 和 /MDd)是不可行的,因为选择了静态链接 (1) 出于安全考虑,并且 (2) 另一个库使用静态链接。这是没有商量余地的——我们别无选择。
为了清楚起见总结(TLDR):我想对所有内容使用静态链接,而我的输出程序是 DLL(不是静态 LIB,不是 EXE)。一切都在 DLL 中静态链接。
有谁知道如何在 Windows 上使用这个库来构建一个带有静态链接的 DLL?
【问题讨论】:
-
你能从 auto_link.hpp 中删除有问题的检查吗?或者在包含 auto_link.hpp 之前 #undef _USRDLL 和 _WINDLL 然后重新定义它们?
-
几周前我刚刚处理了这个问题,但我不记得我脑海中的细节了。我们有一个针对静态 CRT 和静态提升构建的 DLL,并且没有错误/警告。如果到时候没人接,我明天去看看。
-
应该注意的是,构建一个静态链接到 C 运行时库的 DLL 是非常危险的。这意味着在一个 DLL 中分配的内存不能在另一个 DLL 中直接释放。这听起来可能不会发生,但它可以。你会从中得到随机崩溃。
-
这不仅仅适用于静态 CRT。如果您使用与不同版本的动态 CRT 链接的 DLL,则会遇到同样的问题。
-
@noloader:问题似乎是在某处定义了 BOOST_DYN_LINK。我认为您应该找到它的定义位置,因为我认为它不应该是。如果我尝试使用 /MTd 构建您的错误报告(正则表达式)中给出的最小示例并构建为 .dll,它似乎工作得很好(就像 boost 家伙说的那样)。您是否尝试构建那个最小的示例?
标签: c++ windows visual-c++ boost dll