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

标签 android boost android-ndk cocos2d-x boost-serialization

我正在尝试使用 boost 1-49 的序列化库编译一个 android 应用程序。具体来说,这个项目有一些方便的脚本来完成工作:https://github.com/MysticTreeGames/Boost-for-Android

针对官方 ndk-r8 构建的 Boost 没有问题,使用 gnu-libstdc++ 4.6 for armeabi-v7a。

至少,它能够创建 libboost_serialization-gcc-mt-1_49.a 而没有遇到任何错误。在构建过程中出现了几个警告,'禁止零大小数组'_pad'[-pedantic]','不支持'long long','不允许命名的可变参数宏',没有什么看起来很严重,但我不'不要声称自己是 gnu 编译器方面的专家。

Building 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

编辑

好的,午餐时间我在这方面取得了一些进展。通过深入研究 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

结束编辑

鉴于我在使用该库时遇到错误,而且它是我在代码中使用的唯一库,我认为 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)

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)

我最好的猜测是我没有正确构建 boost,但不能肯定地说。是什么导致了这些错误?我什至无法用谷歌搜索据称在序列化库中引用的文件('mbtowc' 和排列)。它是否试图引用我没有通过 makefile 包含的系统或文件系统 boost 库?

最佳答案

boost 序列化在 android-ndk-r8 上不受支持。我将研究 crystaX r7,看看进展如何。看起来,关键区别在于对 wchar 的支持。希望如此。

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

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

期待我下周回到这里说,'不不,实际上我第二次是对的,第四次是对的一半'/苦涩

关于android - 使用 boost 编译 android 应用程序,未定义对 'mbtowc' 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381600/

相关文章:

c++ - boost::bind 隐式转换为 boost::function 或函数指针

ffmpeg - Android 上的静态链接 FFmpeg 库

java - 多行 TextView ,从第二行开始编辑?

c++ - 使用一个TCP套接字的多个请求

android - RadioGroup 可以检查所有答案

c++ - 随机数生成和封装

android - 将录制的音频保存到文件 - OpenSL ES - Android

android - RapidXML android ndk 解析文件的麻烦

Android 应用程序无法连接到 LAN 服务器

Android WebView 不渲染网页