如何解决“type_info 具有隐藏可见性。它们都应该具有公共可见性。”?

ATV*_*ATV 7 c++ macos xcode appkit clang++

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

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

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

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

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

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

事情是,据我所知,符号已经可见,nm并且我的框架都已经具有Default可见性(即NOT Hidden)。

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

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

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

小智 2

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

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

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