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

2023-11-27

我的 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

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

我提交了一份错误报告反对 Boost 的错误假设,但这对我使用该库没有帮助。在报告中,Boost 维护者坚持认为是我设置的(尽管审计表明我没有设置;并且 Boost 在至少 30 个文件中操纵了它)。我发现一个答案在 Boost 邮件列表中,其实质上是要更改我的项目设置以适应 Boost。

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

为了清楚起见总结一下(TLDR):我想对所有内容使用静态链接,而我的输出程序是 DLL(不是静态 LIB,不是 EXE)。一切都在 DLL 中静态链接。

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


简短版本:听听 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 注入开放,无论您如何链​​接到运行时。所以我不认为动态链接比静态链接更不安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“将 dll boost 库与静态运行时混合在一起是一个非常糟糕的主意......” 的相关文章

随机推荐

  • 寻找Java拼写检查库[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个开源 Jav
  • 将 Julia 数组转换为数据帧

    我有一个数组 X 我想将其转换为数据帧 根据网络的推荐 我尝试转换为数据帧并收到以下错误 julia gt y convert DataFrame x ERROR converthas no method matching convert
  • 使用gson反序列化json字符串

    我的 java servlet 以这种方式返回 json 字符串 Gson gson new Gson String lista gson toJson utenti System out println lista request set
  • Android Asynctask处理实时视频帧

    我正在使用 OpenCV 尝试进行一些实时视频处理 由于处理相当繁重 它会显着延迟输出帧 使实时流看起来不稳定 我想将一些处理卸载到 AsyncTask 中 我已经尝试过 它实际上使视频更加流畅 然而 它最终会立即启动大量任务 然后它们会慢
  • Asp.Net Core 中使用 POST 方法重定向到 URL

    我有简单的网址重写器 private static void RedirectToAPI RewriteContext context var request context HttpContext Request if request P
  • 从 MKMapView 找出您所在的区域类型

    有什么方法可以从 MKMapView 确定您所在的区域类型吗 IE 如果地图的中心位于海洋中 我们可以告诉用户 地图的中心位于海洋上方 或者如果地图的中心位于绿色区域上方 地图的中心位于公园上方 我能想到的唯一方法是创建可见屏幕的屏幕截图并
  • 如何使 Typescript 与 SystemJS 和 Angular 一起使用成为可能?

    我试图让 SystemJS 与 Typescript 一起工作 但它们似乎相互冲突 如何利用 System js 的自动加载而不与 Typescript 上的关键字冲突 使用 import require 使得 Typescript 使用它
  • 无法在 IronPython 中使用日期时间

    我将 IronPython 托管在 C Web 应用程序中 如下所示 var engine Python CreateEngine var scope engine CreateScope var script Engine CreateS
  • Composer:如何在 Symfony 2.3 中安装 `dev` 包?

    正在尝试安装KnpGaufrette捆绑包在 Symfony 2 3 项目中 我没有运气 问题是 minimum stability stable in composer json 我需要的包是dev master版本依旧 Reading
  • C# 编译器中的 Duck 类型

    Note这是not关于如何在 C 中实现或模拟鸭子类型的问题 多年来 我一直认为某些 C 语言功能依赖于语言本身定义的数据结构 对我来说 这总是像一个奇怪的先有鸡还是先有蛋的情况 例如 我的印象是foreach循环只能与实现的类型一起使用I
  • UIStackView:从 xib 加载视图并更新子视图的高度约束没有反映任何更改?

    我的应用程序中有以下层次结构 UIScrollView UIStackView UIView 1 load with xib and added in arrangedSubviews UIScrollView 1 1 horizontal
  • 获取 Tkinter Text 小部件中的总行数?

    我有一个 TkinterText小部件 我想知道它包含多少行 我知道的text cget height 方法 但是这只告诉我显示了多少行 我想知道总共有多少行 我正在使用此信息来尝试制作自己的自定义滚动条 因此我们将不胜感激 Use the
  • cx_Oracle.DatabaseError: ORA-12514: TNS:listener 当前不知道连接描述符中请求的服务

    我正在尝试对新安装的系统进行健全性测试Oracle client 12 2 in RHEL 7 linux来自Python程序 但它因上述错误而失败 不确定我在那里缺少什么 请帮忙解决这个案例 cx Oracle DatabaseError
  • Double.parseDouble 和 Integer.parseInt 之间的行为差​​异[重复]

    这个问题在这里已经有答案了 似乎 parseDouble 可以接受带有尾随空格的字符串 但 parseInt 和 parseLong 会抛出异常 例如对于这个测试用例 Test public void testNumberParsing t
  • 正则表达式搜索非常大的文件

    我需要使用正则表达式扫描 300MB 的文本文件 读取整个文件并将其放入变量中会占用超过 700MB 的 RAM 然后会失败并出现 无法分配内存 错误 匹配可以是两行或三行 所以我不能在循环中使用行到行步进 是否有任何惰性方法可以使用正则表
  • WCF maxConnections 属性

    我有一个用 net 4 编写的 WCF 服务 并通过 net tcp 公开 每当我尝试将绑定配置的 MaxConnections 属性设置为高于 10 的值时 我都会遇到 AddressAlreadyInUseException 为什么会在
  • 使用 Secrets 密码时无法连接到 Kubernetes 中的 mysql pod(访问被拒绝)

    我尝试在 Kubernetes 中设置 mysql 数据库 我配置了一个 ConfigMap 来存储数据库名称和一个包含 root 密码 用户和用户密码的 Secret 当我随后尝试连接到数据库时 在容器内使用 mysql cli 从外部使
  • 在.Net Core / EF Core中设置同一类的多个外键

    我正在构建一个 Net Core Web 应用程序 以替换项目管理 SQL Server 数据库的旧版 Access ADP ADE 前端 然而 原始数据库的构建者并没有设置大量外键关系 而是在 SQL 视图中完成这一切 我希望通过这个应用
  • Nutch “http.agent.name”中未列出代理

    Exception in thread main java lang IllegalArgumentException Fetcher No agents listed in http agent name property at org
  • “将 dll boost 库与静态运行时混合在一起是一个非常糟糕的主意......”

    我的 Visual Studio 解决方案中有两个项目 一个构建静态 LIB 另一个构建动态 DLL 两者都使用静态运行时链接 MT 和 MTd 并且都使用 Boost 提升不是我的决定 我想放弃它 但我被委员会否决了 LIB 构建得很好