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を介して含めなかったシステムまたはファイルシステムのブーストライブラリを参照しようとしていますか?