В чем разница между 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 ???

0

Решение

Здесь есть два вопроса:

Почему использование 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.

0

Другие решения

Разница в том, что когда вы используете staticкод std компилируется в результирующий файл .so при использовании sharedВ результате файл так должен иметь STD в отдельном файле так

0

По вопросам рекламы [email protected]