首页 > 解决方案 > 如何解决“type_info's has hidden visibility. they should all have public visibility.”?

问题描述

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

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

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

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

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

根据Apple 的C++ Runtime Environment Programming Guide中的Controlling Symbol Visibility一章,我应该能够使用属性或 GCC pragma 控制类级别的可见性。

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

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

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

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

标签: c++xcodemacosclang++appkit

解决方案


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

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

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


推荐阅读