【问题标题】:What is the difference between gnustl_shared and gnustl_static in Android NDK library .a file?Android NDK 库 .a 文件中的 gnustl_shared 和 gnustl_static 有什么区别?
【发布时间】:2017-03-29 09:06:16
【问题描述】:

我想使用 c++ stl 创建 android 库。

我的构建工具是 Visual Studio 2015,Visual GDB。

源码是

.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

当然,成功构建。因此,创建了 libAndroidProject2-shared.a、libAndroidProject2-shared.so 的 lib 文件

然后,我将它与之前的构建输出进行比较。

我发现 .so 文件的不同之处。 gnustl_static 选项的 .so 文件比 gnustl_shared 选项的大。 但是 .a 是一样的。

为什么? 我使用了 nm,readelf 但找不到区别。 什么是差异???

【问题讨论】:

  • 如果您只为您的 Android 项目创建一个共享库,您可以使用其中任何一个。如果您的 Android 项目包含多个共享库,则需要使用共享版本。

标签: c++ android-ndk gnu visualgdb


【解决方案1】:

这里有两个问题:

为什么使用 gnustl_static 创建的共享库比 gnustl_shared 大?

当您使用静态库时,您会将该库中的代码直接包含到您的共享库中,这样您的库就会增长。当您使用共享库时,您会加载从其他共享库中包含的代码,而不是包含它。您需要比较的大小是 libAndroidProject2-static.so + libgnustl_shared.so,因为两者都必须在运行时存在。

为什么不使用 gnustl_static 制作更大的静态库?

静态库(在本例中为 libAndroidProject2-static.a)未链接;它们只是编译源的档案。 libgnustl_static.a 直到您将 libAndroidProject-static.a 实际链接到某个东西后才会被包含在内,此时您还需要链接 libgnustl_static.a。

当您将 libAndroidProject2-static.a(和 libgnustl_static.a)链接到共享库或可执行文件时,您会看到大小差异。

【讨论】:

  • 也就是说,“.a 文件始终是静态库。即使它添加了选项 APP_STL := gnustl_shared。”对吗?
  • 是的,这就是 .a 的意思。
【解决方案2】:

不同的是,当你使用static时,std的代码被编译成生成的.so文件,而使用shared,生成的so文件需要在单独的so文件中有std

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2012-08-30
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多