Я построил 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.
Мы будем благодарны за любые идеи о том, как получить касабланку для правильной связи на Android.
Благодарю.
(Я отправил этот же вопрос Вот.)
Оказывается, что Касабланка должен быть связан с libstdc ++ но я использую лязг для проекта.
Поэтому я внес следующие изменения, чтобы связать мой модуль проекта с Касабланка.
Я изменился APP_STL от C ++ _ статический в C ++ _ общий в 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 для модуля зависит от Касабланка (так как это зависит от библиотека системного журнала):
LOCAL_LDLIBS := -llog
Фактически закончилась компиляция кода проекта с помощью libstdc ++ (gnustl_shared).