在Android NDK库.a文件中,gnustl_shared和gnustl_static有什么区别
What is the difference between gnustl_shared and gnustl_static in Android NDK library .a file?
我想使用c++stl创建android库。
我的构建工具是visualstudio2015,visualgdb。
源代码是
.cpp
#include <jni.h>
#include "AndroidProject2.h"
#include <vector>
void foo() { std::vector<int> aaa; aaa.push_back(1); }
Android.mk
# Generated by VisualGDB
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AndroidProject2-shared
LOCAL_SRC_FILES := AndroidProject2.cpp
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := AndroidProject2-static
LOCAL_SRC_FILES := $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
应用程序.mk
APP_MODULES := AndroidProject2-static AndroidProject2-shared
APP_ABI := all
APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION :=4.9
我成功构建了,所以创建了lib文件libAndroidProject2-static.a,libAndroidProject2-static.so
比,我尝试更改Application.mk 中的APP_STL选项
APP_MODULES := AndroidProject2-static AndroidProject2-shared
APP_ABI := all
APP_STL := gnustl_shared
NDK_TOOLCHAIN_VERSION :=4.9
当然,成功构建。因此,创建了lib文件libAndroidProject2-shared.a,libAndroidProject2-shared.so
相比之下,我将其与以前的构建输出进行比较。
我发现.so文件的不同之处。gnustl_static选项的.so文件比gnustl_shared选项的it文件大。但是.a是一样的。
为什么?我用了nm,但找不到区别。什么是diff???
这里有两个问题:
为什么使用gnustl_static会生成比gnustl_shared更大的共享库
当您使用静态库时,您会将该库中的代码直接包含到共享库中,这样您的库就会增长。当你使用共享库时,你会加载其他共享库中包含的代码,而不是包含它。你需要比较的大小是libAndroidProject2-static.so+libgnustl_shared.so,因为两者都必须在运行时存在。
为什么不使用gnustl_static创建一个更大的静态库
静态库(在本例中为libAndroidProject2-Static.a)没有链接;它们只是汇编资料的档案。直到您真正将libAndroidProject-static.a链接到某个东西中,libgnustl_static.a才会包含在内,此时您还需要链接libgnustl_static.a
当您将libAndroidProject2-static.a(和libgnustl_static.a)链接到共享库或可执行库时,您会看到大小差异。
不同之处在于,当您使用static
时,std的代码会编译到生成的.so文件中,而使用shared
时,生成的so文件需要在单独的so文件中有std
- 引用 std::shared:ptr 以避免引用计数
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 无法使用 libtool 将 -shared 参数传递给 g++
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- gcc -fPIC vs. -shared
- 在shared_from_this()中的错误类型(在继承类中)(是否有dyn.type-ware shared Poi
- gnustl (libstdc++) to llvm (libc++ ) errors
- "directory containing symbolic versions of my app's shared libraries"的位置(ndk-stack)
- Qt自定义插件无法加载 - "Shared Library Not Found"
- C - Shared Library - dlopen, dlsym
- ubuntu 12.04 中的 openCV 程序编译错误"libopencv_core.so.2.4: cannot open shared object file: No such file or
- boost::shared_ptr和std::shared-ptr的同居
- 将GoogleMock与Boost::Shared Pointers一起使用时泄漏的Mock对象
- Singleton: C++ shared dll
- 传递"shared"指针的 OpenMP 任务
- CMake项目编译精细的SHARED库,但不使用STATIC库
- OpenCV: "libopencv_core.so.2.3: cannot open shared object file: No such file or directory"
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- Qt5/c++ 在调试期间生成'Corrupted shared library list'错误