6

Boost1-49のシリアル化ライブラリを使用してAndroidアプリをコンパイルしようとしています。具体的には、このプロジェクトには、仕事を遂行するための便利なスクリプトがいくつかありました:https ://github.com/MysticTreeGames/Boost-for-Android

armeabi-v7aにgnu-libstdc++4.6を使用して、公式のndk-r8に対して問題なくビルドされたBoost。

少なくとも、エラーは発生せずにlibboost_serialization-gcc-mt-1_49.aを作成できました。ビルド中にいくつかの警告がスローされました。'ゼロサイズの配列を禁止します'_pad'[-pedantic]'、'long long'をサポートしません'、'名前付き可変個引数マクロを許可しません' tはgnuコンパイラの専門家であると主張します。

Boostをビルドすると、libboost_wserialization-gcc-mt-1_49.aも作成されました。これは奇妙に見えましたが、おそらく無関係です。私はそれを私のmakefilesに含めませんでした。

いずれにせよ、このライブラリを使用してコードをコンパイルしようとすると、次のエラーが発生します。

/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::xml_iarchive>::load(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&):./boost/archive/impl/xml_iarchive_impl.ipp:71: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::xml_iarchive>::load(wchar_t*):./boost/archive/impl/xml_iarchive_impl.ipp:101: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::naked_xml_iarchive>::load(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&):./boost/archive/impl/xml_iarchive_impl.ipp:71: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::naked_xml_iarchive>::load(wchar_t*):./boost/archive/impl/xml_iarchive_impl.ipp:101: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_oarchive.o): in function boost::archive::iterators::ostream_iterator<char> std::__copy_move<false, false, std::input_iterator_tag>::__copy_m<boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::ostream_iterator<char> >(boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::ostream_iterator<char>):./boost/archive/iterators/mb_from_wchar.hpp:91: error: undefined reference to 'wctomb'
collect2: ld returned 1 exit status

編集

OK、私は昼食時にこれについていくらかの進歩を遂げました。Boostでこれらのsrcファイルを実際に調べてみると、mbtowcとその逆数がgnu-libstdc++の一部であることがわかりました。だから、どういうわけか私がブーストを構築するとき、それは正しい参照を取得していないに違いありません。昼食時にこれ以上時間を与えることはできませんが、ブーストがどのようにコンパイルされたかを確認しました。使用されたフラグはすべてを適切にリンクしているはずです。

ビルドログから:

Building with TOOLSET=gcc-androidR8 CXXPATH=/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ CXXFLAGS=-I/Users/wespaugh/Development/android-ndk-r8d/platforms/android-14/arch-arm/usr/include -I/Users/wespaugh/Development/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.6/include -I/Users/wespaugh/Development/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

編集を終了

ライブラリでエラーが発生し、それがコードで使用する唯一のライブラリであることを考えると、makefileに問題があるとは思わないでしょう。ただし、徹底するために、ここにコンテンツがあります:Android.mk、コンパイルされたブーストライブラリを保持する場所に含まれています:

# define module to include serialization static library
LOCAL_PATH:= $(call my-dir)

# serialization
include $(CLEAR_VARS)

LOCAL_CFLAGS += -I$(LOCAL_PATH)/include/boost-1_49

# -L$(LOCAL_PATH)/lib/ 
LOCAL_LDLIBS += -lboost_serialization \
        -L$(NDK_ROOT)/sources/cxx-stl/ gnu-libstdc++/4.6/libs/armeabi-v7a \
        -lgnustl_static

LOCAL_CPPFLAGS += -fexceptions
LOCAL_CPPFLAGS += -frtti

LOCAL_CPP_EXTENSION := .cpp .hpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/boost-1_49 \
                    $(LOCAL_PATH)/include/boost-1_49/boost/archive \
                    $(LOCAL_PATH)/include/boost-1_49/boost/serialization

LOCAL_MODULE:= boost_serialization
LOCAL_SRC_FILES:= lib/libboost_serialization-gcc-mt-1_49.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../Classes
include $(PREBUILT_STATIC_LIBRARY)

Android.mk、proj.android / jni /

# compile the app
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LDFLAGS= -L$(NDK_ROOT)/sources/crystax/libs/armeabi-v7a/4.6.3 -Lcrystax 

LOCAL_CPPFLAGS += -fexceptions 

LOCAL_CPPFLAGS += -frtti

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp 

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

LOCAL_WHOLE_STATIC_LIBRARIES := boost_serialization cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

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

私の最善の推測は、私がブーストを正しく構築していないということですが、確かに言うことはできません。これらのエラーの原因は何ですか?シリアル化ライブラリで参照されているとされるファイル(「mbtowc」と順列)をグーグルで検索することすらできないようです。makefileを介して含めなかったシステムまたはファイルシステムのブーストライブラリを参照しようとしていますか?

4

2 に答える 2

1

ブーストシリアル化はandroid-ndk-r8ではサポートされていません。crystaX r7を調べて、それがどのように行われるかを確認します。主な違いはwcharのサポートだと思われます。ここに期待しています。

編集:わかりました、多分そうです。もうわかりません。誰に尋ねるかによっては、公式のndkがwcharをサポートしていると聞くかもしれません。それは、構築先のプラットフォームについて十分に理解するために、boostの構成ファイルを管理するだけの問題です。

さらに、crystaXのNDKでブーストクラッシュに問題があるようだということも学んでいます。

来週ここに戻って、「いやいや、実際には2回目は正しかったし、4回目は半分正しかった」と言ってくれることを期待してください。

于 2013-01-18T04:33:15.967 に答える
0

私も同じ問題を抱えていました。boost::serializationを使用するコード用のAndroidポートを作成していました。

私のコードはどこにもstd::wstringまたはwchar_tを使用していませんでした。

このリンクのアドバイスに従って、Android用のブーストをコンパイルしました:http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

boost-1.55_0とNDKr9cを使用しています。そして、私は同じエラーがありました->

エラー:「mbtowc」への未定義の参照/エラー:「wctomb」への未定義の参照

ただし、(jam構成ファイルを介して)次のフラグを追加してboostを再コンパイルしました。

<compileflags>-DBOOST_NO_STD_WSTRING

今回、作成されたライブラリはmbtowcを使用せず、シリアル化は私のために機能します。

于 2014-05-12T17:19:50.237 に答える