0

私は、NDKとBoostライブラリ、およびCocos2d-xゲームエンジンの一部であるライブラリを使用してAndroidプロジェクトに取り組んでいます。私が抱えている問題は、ライブラリのリンクとNDKの使用に関する単純な問題だと思いますが、完全を期すためにBoostとcocos2d-xについて言及します。

ndk-buildを使用してプロジェクトをビルドしようとすると、すべてのコードがオブジェクトファイルに正常にコンパイルされているように見えます。これは、g++が使用しているすべてのライブラリヘッダーを見つけることができることを示しています。G ++は、リンクが開始されると爆発します。これは、コードとライブラリを結び付ける共有ライブラリを構築しようとするためです。

エラーのあるビルドログは、http://txtup.co/tMtJにあります。

発生する最初のエラー、

C:/Android/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.7/../../ .. /../arm-linux-androideabi/bin/ld.exe:エラー:開くことができません./obj/local/armeabi/libgnustl_static.a:アクセスが拒否されました

libgnustl_static.aには、「std :: string :: operator +」のようなすべての関数の実装が含まれている必要があるため、g++はそのエラーの後に参照が見つからないと言っているので非常にわかりやすいようです。

libgnustl_static.aはビルド中に./obj/local/armeabiにコピーされるので、私のmakefileは少なくともある時点でライブラリを認識していることがわかります。その「許可が拒否されました」エラーの前にそれが起こると思いますが、確信が持てません。

以下は、このすべてのコンパイルの最終製品になりたいlibgame.soライブラリのandroid.mkです。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

LOCAL_SRC_FILES += hellocpp/main.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
            $(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/ \
$(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/boost/archive \
$(LOCAL_PATH)/../../../cocos2dx/platform/third_party/android/prebuilt/libboost_serialization/include/boost/serialization                

LOCAL_WHOLE_STATIC_LIBRARIES := boost_1_53_serialization cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,libboost_serialization) \
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions)

makefileがlibgnustl_staticを検索または使用できない理由はありますか?または、権限を変更する作業ディレクトリにライブラリをコピーする方法に何かありますか?

4

2 に答える 2

0

gnustl を使用した cocos2d-x にサンプルがあります。

*.mk ファイル (Android.mk と Application.mk の両方) をベースにしてみてください: https://github.com/cocos2d/cocos2d-x/tree/master/samples/Cpp/HelloCpp/proj.android/jni

于 2013-03-15T21:18:00.607 に答える
0

gcc/NDKこれは、 Linux、Cygwin、および Windows (Cygwin 以外) でわずかに異なって現れるバグです。

それを実行ndk-build V=1してログ ファイルにパイプする場合 (例: ndk-build V=1 &> logfile)。一連のオブジェクトがコンパイルされ、さらに少し下ると、それらがリンクされていることがわかります。その後、リンク エラーが「爆発」して発生します。これらのエラーは libgnustl に関連しています。次に、エラーを引き起こしたコマンドを見てください。NDK r8d より前は、libgnustl_static は objs ディレクトリにコピーされ、そこからリンクされていました。今で$(NDK_ROOT)、そこにあることがわかりますが、gcc の理由から最後 (またはその近く) にある必要があります。

これが私がそれを修正するためにしたことです...

  • " " という行をApplication.mkAPP_STL := gnustl_staticから削除します(これは NDK では壊れており、Linux Cygwin、Windows では壊れ方が少し異なります)。
  • Android.mkファイルに次の行を追加$(LOCAL_LDLIBS)します。

    $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a

    "

  • また、 Android.mkに次の 2 行を追加します。

    LOCAL_C_INCLUDES := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/include LOCAL_C_INCLUDES += $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

これにより、 Application.mkAPP_STL := gnustl_staticに " "が含まれているはずだったことが達成されます。

于 2013-05-20T14:55:37.060 に答える