0

ここの手順に従って Android 用のカサブランカをビルドしました: How to build and setup for Android on Linux (2.3+)

コンパイルしたライブラリを Android プロジェクトに移動し、次の手順に従って casablanca に依存するモジュールをリンクしました: How to use the C++ REST SDK on 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 VM で構築し、私の Android プロジェクトは Windows-64 マシン上にあります。ただし、Linux で Android 用の casablanca の共有ライブラリをビルドしようとすると、複数のリンカー エラーも発生しました。

libstdc++ でコンパイルされたコードと libc++ でコンパイルされたコードがあると思われます。ビルド スクリプトを見ると、clang がブーストとカサブランカの両方に使用されていることがわかりますが、gcc ヘッダーを指すインクルード パスも確認できます。Linux VM パスで /sources/cxx-stl/gnu-libstdc++/4.8/include/ への参照がリンカー出力 (Windows の場合) に表示される理由についても興味があります。

Android でカサブランカを適切にリンクする方法についての洞察をいただければ幸いです。

ありがとう。

(私はこの同じ質問をここに投稿しました。)

4

2 に答える 2

0

casablancaはlibstdc++に対してリンクする必要があることがわかりましたが、私はプロジェクトにclangを使用しています。

そこで、プロジェクト モジュールをcasablancaにリンクするために次の変更を加えました。

Application.mkでAPP_STLc++_staticからc++_sharedに変更しました。

また、依存関係モジュールがある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)

さらに、casablancaに依存するモジュールのAndroid.mkに次を追加します (システム ロギング ライブラリに依存するため)。

LOCAL_LDLIBS    := -llog
于 2014-12-04T16:08:55.750 に答える
0

実際に libstdc++ (gnustl_shared) でプロジェクト コードをコンパイルすることになりました。

于 2014-12-10T06:02:46.137 に答える