我正在构建一个Android库,其中包含使用STL编写的本机部分,该部分隐藏在Java包装器下。在Static runtimes部分的NDK文档中,声明我应该使用共享运行时来避免多个静态运行时的问题,但我想尝试使用gnustl_static
设置标志-fvisibility=hidden
。
问题是,它是否会解决可能存在的问题,或者共享库是唯一的出路?
答案 0 :(得分:0)
不,使用-fvisibility=hidden
构建无助于将多个库链接到静态C ++运行库所产生的问题。
除非您自己构建gnustl_static
,否则-fvisibility=hidden
标记仅适用于依赖于gnustl_static
的本机代码。它不会改变从gnustl_static
导出符号的方式。
此外,如果您链接两个共享库 - 或共享库和 一个可执行文件 - 针对相同的静态运行时,最终的二进制图像 每个共享库的一部分包括运行时代码的副本。有 多个运行时代码实例是有问题的,因为 重复运行时使用的某些全局变量或 内部提供。
但是,只要您只创建一个共享库,链接到静态C ++运行时应该可以正常工作。
此问题不适用于包含单个共享的项目 图书馆。例如,您可以链接到stlport_static,并期望 你的应用程序行为正常。如果您的项目需要多个共享 库模块,我们建议您使用共享库变体 您的C ++运行时。