Wes*_*ugh 6 android boost boost-serialization android-ndk cocos2d-x
我正在尝试使用boost 1-49的序列化库来编译一个Android应用程序.具体来说,这个项目有一些方便的脚本来完成工作:https://github.com/MysticTreeGames/Boost-for-Android
使用gnu-libstdc ++ 4.6为armeabi-v7a构建没有针对官方ndk-r8的问题.
至少,它能够创建libboost_serialization-gcc-mt-1_49.a而不会遇到任何错误.在构建期间抛出了几个警告,'禁止零大小数组'_pad'[-pedantic]','不支持'long long','不允许命名的变量宏',没有什么看起来很严重,但我不知道声称自己是gnu编译器的专家.
构建boost也创建了libboost_wserialization-gcc-mt-1_49.a,这似乎很奇怪,但可能无关紧要.我没有将它包含在我的makefile中.
无论如何,当我现在尝试使用此库编译我的代码时,我收到以下错误:
/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
Run Code Online (Sandbox Code Playgroud)
编辑
好的,我在午餐时间取得了一些进展.通过实际挖掘boost中的那些src文件,我发现mbtowc及其倒数是gnu-libstdc ++的一部分.所以,不知何故,当我构建boost时,它一定不能得到正确的引用.不能再给它午餐时间,但我已经看过如何编译boost,并且使用的标志应该适当地连接所有内容.
从构建日志:
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
Run Code Online (Sandbox Code Playgroud)
结束编辑
鉴于我在使用库时遇到错误,并且它是我在代码中使用的唯一库,我不认为makefile可能存在问题.但是为了彻底,这里有内容:Android.mk,包括我保存编译的boost库:
# 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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是我没有正确构建助推器,但不能肯定地说.什么可能导致这些错误?我甚至无法谷歌那些据称在序列化库中引用的文件('mbtowc'和permutations).它是否尝试引用系统或文件系统boost库,我没有通过makefile包含它?
android-ndk-r8 不支持 Boost 序列化。我会研究crystaX r7,看看效果如何。看来关键的区别是对 wchar 的支持。这里有希望。
编辑:好吧,也许是这样。我不知道了。根据您询问的人,您可能会听说官方 ndk确实支持 wchars,这只是管理 boost 的配置文件以充分了解您正在构建的平台的问题。
此外,我还了解到,crystaX 的 NDK 显然存在 boost 崩溃问题。
希望我下周回到这里说,‘不不,实际上我第二次是对的,第四次是对了一半’/苦涩
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |