libgnustl_shared.so 从哪里来?为什么我构建后它的大小不同?

Where does libgnustl_shared.so come from? Why its size is different after I build?

我正在使用 armeabi-v7a 的 NDK (r11b) 为 Android 构建库,我发现 libgnustl_shared.so 的不同版本并且不明白为什么。

主要问题:为什么编译后的文件比原来的小? linker/compiler 是否在某些时候缩小文件(删除未使用的符号)?

奖金问题: 我终于用 QtCreator 构建了我的项目(最终得到 846ko 的 libgnustl_shared.so)并给出我的 so 文件(但 libgnustl_shared.so)交给其他人,他们将把它集成到他自己的应用程序中。在他部署了他的应用程序之后,他的 IDE(我相信是 Android 工作室)用 694ko 的 libgnustl_shared.so 部署了它,我的代码开始崩溃STL 操作。这些崩溃可能是由于使用的 libgnustl_shared.so 不匹配造成的吗?我们应该如何解决这个问题? (因为QtCreator不让我用libgnustl_shared.so的静态版本构建,最后部署应该用哪个版本?)

请注意,我的项目是使用 QtCreator 编译的,但没有使用 Qt(我使用 Qt 从 GUI 测试我的库,但库本身根本不使用 Qt)

Why is the file after compilation smaller than the original one? Does the linker/compiler shrink the file at some point (removing unused symbols)?

是的,共享库在安装到库out目录后被剥离。 NDK 中的库没有预先剥离,因为这样做会阻止用户调试它们。

另请注意,对于 r11 和更早版本,有两个 armeabi-v7a 库。您指定的那个,另一个在 "thumb" 子目录中。实际只使用了拇指一个(这就是为什么在 r12 中删除了非拇指的原因)。

Could those crashs be due to a mismatch with libgnustl_shared.so used?

如果它们是 libgnustl_shared.so 的不同版本(不是来自同一 NDK 版本),是的,绝对是。如果它们都来自 r11 并且都是 armeabi-v7a(thumb 或非 thumb),那么它们应该是兼容的。如果其中任何一个正在使用库的 armeabi-v7a-hard 版本(在 r12 中删除),那么这肯定也是一个问题。 armeabi-v7a 与 armeabi 的混合不太确定,但可能是一个问题。