C++ 在GCC中,如何在不导出所有符号的情况下导出共享库的所有typeinfo符号?

C++ 在GCC中,如何在不导出所有符号的情况下导出共享库的所有typeinfo符号?,c++,gcc,linker,visibility,typeinfo,C++,Gcc,Linker,Visibility,Typeinfo,问题是: 我有一个默认情况下隐藏符号的共享库。实际上,它使用-Xlinker--version script=选项导出特定文件中的一些符号,但隐藏所有其他符号。问题是,如果我们试图捕获在其他共享库中定义的异常,就会出现问题,因为这个共享库隐藏了typeinfo。我无法显式地使异常类可见,因为它们是在我无法控制的开源库中定义的。我也不想在版本脚本符号文件中明确列出异常类的typeinfo的损坏名称,因为有许多开发人员正在使用这个库,他们将来一定会忘记为某些异常类执行此操作 在开源.hpp文件之前,

问题是:

我有一个默认情况下隐藏符号的共享库。实际上,它使用-Xlinker--version script=选项导出特定文件中的一些符号,但隐藏所有其他符号。问题是,如果我们试图捕获在其他共享库中定义的异常,就会出现问题,因为这个共享库隐藏了typeinfo。我无法显式地使异常类可见,因为它们是在我无法控制的开源库中定义的。我也不想在版本脚本符号文件中明确列出异常类的typeinfo的损坏名称,因为有许多开发人员正在使用这个库,他们将来一定会忘记为某些异常类执行此操作

在开源.hpp文件之前,我尝试过使用#pragma GCC可见性推送(默认),但它似乎不起作用-符号不可见

我还尝试使用-fvisibility ms compat,它确实导出了typeinfo符号,但也导出了大量我不想导出的其他符号。库中既有C代码又有C++代码,所以我不知道它是如何使用这个选项的,它只针对C++。
我真正需要的是一个选项,该选项将使所有typeinfo符号可见,同时隐藏其他符号(除非它们显式可见)。有这样的选项吗?

对于您的问题,最直接的答案是尝试ld选项
--动态列表cpp typeinfo
。我没有得到最好的运气,但YMMV


你不能说你是在哪个平台上建造的。表面上,您正在使用mingw,因为您已经尝试了
-fvisibility ms compat
;但是,如果您实际上使用的是像Linux这样的ELF目标,请尝试从您的版本脚本中导出符号通配符
\u ZTI*
\u ZTN*
。(你可以在Windows上做类似的事情,但是只要VisualC++名字的名字没有被真正记录,我就不知道你可以使用任何罐头通配符。)< /P>也许通过处理<代码> NM之类的输出来动态地生成链接器脚本。只是一个猜测。这可能是一个好办法。我已经考虑过了,虽然我不喜欢额外的脚本工作,但这可能是最好的答案。谢谢你的建议!