Ошибки компоновщика Casablanca на Android

Я собрал casablanca для Android в соответствии с инструкциями здесь: Как собрать и настроить для Android в Linux (2.3+).

Я переместил скомпилированные библиотеки в свой проект Android и связал модуль, который зависит от casablanca, в соответствии с инструкциями здесь: Как использовать C++ REST SDK на Android (2.3+).

Однако я получаю несколько ошибок компоновщика.

Например, при попытке использовать

json::value::string( "some value" );

Я получил,

error: undefined reference to 'web::json::value::string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)'

И при попытке использовать

json::value version;
version[someValue] = something;

Я получил,

error: undefined reference to 'web::json::value::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)'

Я компилирую свой Android-проект с clang.

Я создал виртуальную машину Linux-64, а мой проект Android находится на машине с Windows-64. Однако при попытке создать общую библиотеку casablanca для Android в Linux я также получил несколько ошибок компоновщика.

Я подозреваю, что какой-то код компилируется с помощью libstdc++, а какой-то с libc++. Глядя на сценарии сборки, я вижу, что clang используется как для boost, так и для casablanca, но я также вижу пути включения, указывающие на заголовки gcc. Мне также любопытно, почему я вижу в выводе компоновщика (в Windows) ссылки на /sources/cxx-stl/gnu-libstdc++/4.8/include/ с моим путем виртуальной машины Linux.

Мы будем признательны за любые идеи о том, как правильно связать casablanca на Android.

Спасибо.

(Я разместил этот же вопрос здесь.)


person Luis    schedule 03.12.2014    source источник
comment
Я избавился от ошибок компоновщика... Скоро опубликую решение...   -  person Luis    schedule 04.12.2014


Ответы (2)


Оказывается, casablanca нужно связать с libstdc++, но я использую clang для проекта.

Поэтому я внес следующие изменения, чтобы связать модуль моего проекта с casablanca.

Я изменил APP_STL с c++_static на c++_shared в < strong>Application.mk.

Кроме того, в файле Android.mk, где у меня есть модули зависимостей, я добавил следующее:

#GNU STL 
#Note: this is the GNU STL static library used by casablanca
include $(CLEAR_VARS)
LOCAL_MODULE    :=  gnustl
LOCAL_SRC_FILES :=  ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/libs/$(TARGET_ARCH_ABI)/libgnustl_static.a
include $(PREBUILT_STATIC_LIBRARY)

#Casablance prebuilt
#Note: These are the includes that casablanca uses.
include $(CLEAR_VARS)
LOCAL_MODULE    :=  casablanca
LOCAL_SRC_FILES :=  $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/libcpprest.a
LOCAL_EXPORT_C_INCLUDES := ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include \
                           ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/libs/$(TARGET_ARCH_ABI)/include \
                           ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include/backward
LOCAL_WHOLE_STATIC_LIBRARIES := gnustl
include $(PREBUILT_STATIC_LIBRARY)

Кроме того, я добавляю следующее в Android.mk для модуля, зависящего от casablanca (поскольку он зависит от системной библиотеки журналов):

LOCAL_LDLIBS    := -llog
person Luis    schedule 04.12.2014

Фактически закончилось компиляцией кода проекта с помощью libstdc++ (gnustl_shared).

person Luis    schedule 10.12.2014