使用boost编译android应用程序,未定义引用'mbtowc'

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包含它?

Wes*_*ugh 1

android-ndk-r8 不支持 Boost 序列化。我会研究crystaX r7,看看效果如何。看来关键的区别是对 wchar 的支持。这里有希望。

编辑:好吧,也许是这样。我不知道了。根据您询问的人,您可能会听说官方 ndk确实支持 wchars,这只是管理 boost 的配置文件以充分了解您正在构建的平台的问题。

此外,我还了解到,crystaX 的 NDK 显然存在 boost 崩溃问题。

希望我下周回到这里说,‘不不,实际上我第二次是对的,第四次是对了一半’/苦涩