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
的不同版本并且不明白为什么。
在ndk文件夹中(在android-ndk-r11b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a\libgnustl_shared.so)它的大小是5593ko.
在我使用 ndk-build.cmd 构建项目(一堆库)后,库(在 libs\armeabi-v7a\libgnustl_shared.so 中)文件大小为 694ko.
在我使用 QtCreator 构建我的项目(一堆库)之后,库(在 android-build\libs\armeabi-v7a\libgnustl_shared.so 中)文件大小为 846ko。请注意,打包在 apk 中的库(在 android-build\bin 中)具有相同的大小。另请注意,QtCreator 生成日志报告它从 (android-ndk-r11b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/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 的混合不太确定,但可能是一个问题。
我正在使用 armeabi-v7a 的 NDK (r11b) 为 Android 构建库,我发现 libgnustl_shared.so
的不同版本并且不明白为什么。
在ndk文件夹中(在android-ndk-r11b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a\libgnustl_shared.so)它的大小是5593ko.
在我使用 ndk-build.cmd 构建项目(一堆库)后,库(在 libs\armeabi-v7a\libgnustl_shared.so 中)文件大小为 694ko.
在我使用 QtCreator 构建我的项目(一堆库)之后,库(在 android-build\libs\armeabi-v7a\libgnustl_shared.so 中)文件大小为 846ko。请注意,打包在 apk 中的库(在 android-build\bin 中)具有相同的大小。另请注意,QtCreator 生成日志报告它从 (android-ndk-r11b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/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 的混合不太确定,但可能是一个问题。