cmake とandroid-cmakeを使用して Android 用にコンパイルし、静的ライブラリを取得するライブラリがあります。
次に、このような Android.mk ファイルを使用して、テスト プロジェクトをこの静的ライブラリにリンクしようとしました。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := ../test.cxx
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../src
LOCAL_CFLAGS := -std=gnu++11 -D__ANDROID__
LOCAL_CPP_FEATURES += exceptions
LOCAL_LDLIBS += -L.. -ljson++
include $(BUILD_EXECUTABLE)
そしてApplication.mk
NDK_TOOLCHAIN_VERSION = 4.7
APP_STL := gnustl_static
json++ は、以前に cmake で構築したライブラリの名前です。
とのリンク中に失敗します
../libjson++.a(object.cpp.o):object.cpp:function json::error_json_object_invalid_type(void const*, json::object_type, json::object_type, char const*): エラー: 'std への未定義の参照::basic_ostringstream, std::allocator >::~basic_ostringstream()' ../libjson++.a(object.cpp.o):object.cpp:関数 json::error_json_object_invalid_type(void const*, json::object_type, json ::object_type, char const*): エラー: 'std::basic_ostringstream の VTT、std::allocator >' への未定義の参照 ../libjson++.a(object.cpp.o):object.cpp:function json:: error_json_object_invalid_type(void const*, json::object_type, json::object_type, char const*): エラー: 'vtable for std::basic_ostringstream, std::allocator >' への未定義参照 >' ../libjson++.a(object.cpp .o):object.cpp:関数 json::error_json_object_invalid_type(void const*,json::object_type, json::object_type, char const*): エラー: 'vtable for std::basic_stringbuf, std::allocator >' への未定義参照 ../libjson++.a(object.cpp.o):object. cpp:function json::error_json_object_no_such_key(void const*, void const*, unsigned int): エラー: 'std::basic_ostringstream, std::allocator >::~basic_ostringstream()' への未定義参照 ../libjson++.a( object.cpp.o):object.cpp:function json::error_json_object_no_such_key(void const*, void const*, unsigned int): エラー: 'VTT for std::basic_ostringstream, std::allocator >' への未定義参照 .. /libjson++.a(object.cpp.o):object.cpp:function json::error_json_object_no_such_key(void const*, void const*, unsigned int): エラー: std::basic_ostringstream の 'vtable への未定義の参照、std::アロケータ >' ../libjson++.a(object.cpp.o):object.cpp:function json::error_json_object_no_such_key(void const*, void const*, unsigned int): エラー: 'vtable for std::basic_stringbuf, std::allocator >' への未定義の参照 ../libjson++.a (object.cpp.o):object.cpp:関数 std::basic_stringbuf、std::allocator >::~basic_stringbuf(): エラー: 'vtable for std::basic_stringbuf、std::allocator >' collect2 への未定義参照: エラー: ld は 1 つの終了ステータスを返しました make:collect2: エラー: ld が 1 つの終了ステータスを返しました make:collect2: エラー: ld が 1 つの終了ステータスを返しました make:* [obj/local/armeabi/test] エラー 1
このエラーは、libgnustl_static.a が -ljson++ の前にコンパイラーの呼び出しにあるために発生します。
/opt/android-ndk/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,--gc-sections -Wl,-z,nocopyreloc --sysroot=/opt/android-ndk/platforms/android-3/arch-arm ./obj/local/armeabi/objs/test/__/test.o /opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi/libgnustl_static.a -lgcc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -L/opt/android-ndk/platforms/android-3/arch-arm/usr/lib -L.. -ljson++ -lc -lm -o ./obj/local/armeabi/test
したがって、追加することで解決できます
-L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/ -lgnustl_static
LOCAL_LDLIBS へ
そして今の質問:既存の静的ライブラリが私のプロジェクトに属しておらず、別のビルドシステムでコンパイルされている場合、既存の静的ライブラリにリンクする正しい方法は何ですか?