В чем разница между gnustl_shared и gnustl_static в файле.a библиотеки Android NDK?
Я хочу создать библиотеку Android с использованием C++ STL.
Мои инструменты сборки 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)
Application.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
чем, я пытаюсь изменить параметр APP_STL в Application.mk
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 файла. Файл.so опции gnustl_static больше, чем опция gnustl_shared. но.а то же самое.
Зачем? Я использовал nm, readelf, но не могу найти разницу. что такое diff???
2 ответа
Здесь есть два вопроса:
Почему использование 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) в общую библиотеку или в execctable.
Разница в том, что когда вы используете static
код std компилируется в результирующий файл.so при использовании shared
В результате файл так должен иметь STD в отдельном файле так