如何在没有STL的情况下构建Android NDK .so?
我正在使用最新的 Android NDK r6b 来构建我的共享对象。该库根本不使用任何类型的 STL,但生成的 .so 包含许多 STL 内容,例如 std::bad_alloc_what(void) 等,这大大增加了二进制文件的大小。发布版本也包含这些垃圾。 APP_STL 未在任何地方定义,NDK r5b 也生成仅包含使用过的函数的小型二进制文件。是r6b的bug吗?如何在没有 STL 的情况下使用 r6b 进行构建?
I'm using the newest Android NDK r6b to build my shared object. This library does not use any kind of STL at all, but resulting .so includes many STL stuff like std::bad_alloc_what(void) and many more, which increases size of binary greatly. Also release builds include this garbage. APP_STL not defined anywhere, also the NDK r5b produces small binary with used functions only. Is it a bug of r6b? How can I build with r6b without STL stuff?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
NDK r6b 似乎存在一个错误,它总是构建具有异常支持的库,即使显式指定了
-fno-exceptions
也是如此。有关详细信息,请参阅此问题: Android NDK 生成不合理大的二进制文件,如何优化.so大小?
It seems that there is a bug in NDK r6b and it always builds libraries with exceptions support, even if
-fno-exceptions
is explicitly specified.See this question for details: Android NDK produce unreasonable big binaries, how to optimize .so size?
如果您使用的是
new
,那么您就隐式使用了标准库来处理std::bad_alloc
异常。除非您调用new
的无抛出版本,否则它将使用std::nothrow
。如果您不使用标准库,则它不会被链接。只要确保你不这样做(如果这是你想要的),或者也许只是转移到 C?If you are using, say,
new
then you are implicitly using the standard library for thestd::bad_alloc
exception. Unless you call the no-throw version ofnew
, which would instead usestd::nothrow
. If you don't use the standard library, then it won't get linked. Just make sure you don't, if that's what you want, or perhaps just move to C?