【问题标题】:Is it possible to disable Exceptions and RTTI in Boost libraries?是否可以在 Boost 库中禁用异常和 RTTI?
【发布时间】:2012-06-30 20:45:48
【问题描述】:

我为 Android 开发了一些本机库并使用 Boost 库 - 只是基于标头的库。我面临的问题是,当我尝试将我的一些本机库与一些系统库链接时,UnsatisfiedLinkError 被抛出。这是由于 NDK 文档中所述的不同 C++ 运行时所致:

您只能选择一个 C++ 运行时,您的所有代码都将 取决于。不能混合针对编译的共享库 不同的 C++ 运行时。

系统库不使用 RTTI 和异常,但我的库隐式使用它。 我知道有宏 BOOST_EXCEPTION_DISABLEBOOST_NO_RTTI,但我无法让它工作。我尝试将它们设置为编译器标志和 config.hpp,但没有运气 - 仍然遇到很多错误,例如

cannot use typeid with -fno-rtti

如何在 Boost 中禁用这些功能,甚至可能吗?

【问题讨论】:

  • 您在尝试编译 Boost 时是否遇到该错误?或者尝试编译自己的代码时?
  • 尝试编译我自己的代码时。
  • Boost 并不完美,你知道的。您是否在typeid 的标记用途处检查了源代码,以查看该代码是否包含在#ifndef BOOST_NO_RTTI 中?或者也许是另一个宏?这可能是开发人员的一个简单遗漏,因为我认为禁用 rtti 并不是最常见的事情,并且可能永远不会被报告为错误。如果有禁用 RTTI 和异常的标志,那么如果它们不起作用,那就是 Boost 中的一个错误。
  • 我在谷歌上搜索了很多,似乎不可能。我已经放弃并重写了我的代码。我在桌面开发中使用 Boost 多年,并没有预料到 Android 会出现任何问题——这是我的错。它太健壮了,不适合嵌入式开发……;至少如果您需要与系统库链接,否则它可以正常工作。
  • @vitakot - 您确实意识到,如果您提供的唯一信息是您有一些未指定的链接器错误,那么您将得到的最佳答案是,“糟糕的是你,希望你能想到出来。”听起来您已经有了一般性的答案,但遇到了具体的问题,但您没有提供具体的错误消息或具体的、可重复的步骤。也就是说,您提到您使用的是仅标头库,但您还使用了升压信号(不是信号2)。信号已编译,或者是我上次检查的。

标签: c++ boost android-ndk


【解决方案1】:

答案是“也许”。 一些 boost 库将在禁用异常的情况下工作 - 有些则不会。 RTTI 也一样。

我建议您查看您感兴趣的特定 boost 库的文档。

例如,Boost.Array 可以在禁用异常的情况下工作,但 Boost.Format 不会。

如果您收到cannot use typeid with -fno-rtti 之类的消息,那可能是在编译需要 RTTI 的 Boost 的某些部分时。发生错误的位置会告诉您(通常)是哪个库。

【讨论】:

  • 感谢您的回答!你可能是对的。此消息与升压信号库有关,它还使用boost bind,这意味着使用boost any,如果没有启用rtti,这个功能可能是不可能的......实际上升压应该根据编译器设置自行设置,所以我相信它是没有必要明确定义BOOST_NO_RTTI 等。
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2010-10-07
相关资源
最近更新 更多