【问题标题】:How to fix "type_info's has hidden visibility. They should all have public visibility."?如何修复“type_info 的可见性隐藏。它们都应该具有公开可见性。”?
【发布时间】:2018-12-20 05:06:02
【问题描述】:

在 macOS 系统控制台上,启动我的一个应用程序时会记录此错误:

APP[28193]:dynamic_cast 错误 2:以下一个或多个 type_info 具有隐藏可见性。他们都应该有公众知名度。 17CPPNameOfClassA,28CPPNameOfClassB。

据我所知,它(还)不影响功能,但显然有问题。在 Clang 来源中检查此警告的来源也表明它会对性能产生影响。

这是为一个框架生成的,其中包括我的应用程序中引用它的其他框架使用的 C++ 类。

FWIW,警告是由 Clang (https://github.com/llvm-mirror/libcxxabi/blob/master/src/private_typeinfo.cpp) 中的 private_typeinfo.cpp 类引起的。

根据 Apple 的 C++ 运行时环境编程指南中的控制符号可见性一章,我应该能够使用属性或 GCC 编译指示控制类级别的可见性。 p>

问题是符号已经可见,据我所知 nm 和我的框架都已经具有 Default 可见性(即不 Hidden)。

同时使用(属性或编译指示)强制默认可见性会导致应用在之前仅创建警告的地方崩溃。

奇怪的是,此警告仅针对某些类生成,而大多数其他类在同一编译单元/框架中不会引起任何警告。

非常感谢任何有关如何解决此问题的进一步提示或想法!

【问题讨论】:

  • 我遇到了这个错误,它是由于试图对一个未初始化的变量进行 dynamic_cast 造成的,但碰巧持有指向来自不同类层次结构的对象的指针。

标签: c++ xcode macos clang++ appkit


【解决方案1】:

这是一个老问题,但也许这会帮助其他有同样问题的人。

发生这种情况的原因之一是您的应用加载了同一个库的多个不同版本。例如,就我而言,我只是没有从库搜索路径中删除旧版本的路径。尝试查看(在调试器中)您的应用中加载了哪些库,并检查是否未从不同位置加载同一个库。

在尝试解决此问题时,我发现这些链接很有用:https://forums.wxwidgets.org/viewtopic.php?t=42566、http://www.russellmcc.com/posts/2013-08-03-rtti.html。

【讨论】:

  • 感谢您的信息,但我只是在这个应用程序中使用了一堆我自己的框架。
  • 很好的答案,那篇文章的作者真的帮助了我提出的单元测试!我在将大型商业产品移植到 MacOS 时遇到了类似的问题,我相信这个单元测试会很有用。
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 2013-06-01
  • 2020-02-28
  • 2013-07-06
  • 2017-07-04
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多