【问题标题】:error: 'to_string' is not a member of 'std'错误:“to_string”不是“std”的成员
【发布时间】:2014-11-23 14:37:06
【问题描述】:

它可能是重复的,但我尝试了我在 StackOverflow 上找到的所有解决方案。

我正在使用 OpenCV 在 C++ 上创建一个库,并尝试为 Android 编译它。

我不能使用to_string(int)但我不能。我试图修改我的makefile太多次了。我最后的配置是这样的:

Android.mk

LOCAL_PATH := $(call my-dir)

包括 $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=关闭

OPENCV_INSTALL_MODULES:=开启

包括 $(LOCAL_PATH)/jsoncpp/Android.mk

包括 /Users/rafaelruizmunoz/Desktop/AndroidDevelopment/OpenCV-2.4.9-android- sdk/sdk/native/jni/OpenCV.mk

OPENCV_LIB_TYPE:=共享

LOCAL_C_INCLUDES += $(LOCAL_PATH)

LOCAL_C_INCLUDES += /Users/rafaelruizmunoz/opencvscan/OpenCVtry/

LOCAL_C_INCLUDES += /Users/rafaelruizmunoz/Desktop/RD/OpenCVtry/Libraries/jsoncpp- 主/包含

LOCAL_PATH := jni

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

LOCAL_MODULE := libXYZ

LOCAL_MODULE_NAME := mylibXYZ

LOCAL_SRC_FILES := androidClass.cpp main.cpp utils.cpp

LOCAL_LDLIBS += -llog -ldl

LOCAL_CPPFLAGS := -std=c++11 CFLAGS=-g -Wall -Wextra -std=c++11 -Wno-write-strings ../../include/boost

LOCAL_SHARED_LIBRARIES := libJsoncpp libopencv_java

包括 $(BUILD_SHARED_LIBRARY)

这是我的 Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

APP_ABI := 全部

APP_MODULES := libXYZ libJsoncpp

APP_CPPFLAGS := -std=gnu++0x

APP_CPPFLAGS += -frtti

APP_CPPFLAGS += -fexceptions

APP_CPPFLAGS += -DDEBUG

APP_CPPFLAGS += -std=c++11

NDK_TOOLCHAIN_VERSION := 4.8

LOCAL_C_INCLUDES += ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include

APP_USE_CPP0X := 真

提前致谢。

【问题讨论】:

  • 在尝试使用std::to_string之前,您的源文件是否包含<string>...?如果是这样,您可以使用g++ -E ... 查看预处理器输出,并检查to_string 是否存在...如果不检查标题中的条件#ifdef,并谷歌搜索您所缺少的任何定义。 XCode 可能正在定义您需要的额外预处理器符号...
  • 是的,它在 XCode 上运行良好。当我编译它时,该库可以完美运行。
  • 好的,我这就去做

标签: android c++ opencv c++11 android-ndk


【解决方案1】:

我也遇到过这个问题。 to_string 在“开箱即用”的 gnu-libstdc++ 中不可用。我搜索了源代码,发现 std::to_string 确实在库中(sources/cxx-stl/gnu-libstdc++/4.9/include/bits/basic_string.h),但被

#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

在将 -D_GLIBCXX_USE_C99 添加到构建后,std::to_string 被选择加入。

【讨论】:

    【解决方案2】:

    Android NDK 9+ 附带llvm-libc++,它完全支持 cpp11 功能。要启用它,您所要做的就是在 Application.mk 中修改这些:

    APP_CPPFLAGS := -std=c++11
    

    APP_STL:=c++_static 
    

    APP_STL:=c++_shared
    

    【讨论】:

    • 这个stdlib兼容GCC,不仅兼容clang,是吗?
    【解决方案3】:

    你可以试试这个:

    #include <string>
    #include <sstream>
    
    #if defined(__ANDROID__)
    #define TO_STRING to_stringAndroid
    
    template <typename T>
    inline std::string to_stringAndroid(const T& value)
    {
        std::ostringstream os ;
        os << value ;
        return os.str() ;
    }
    
    
    #else
    
    #define TO_STRING std::to_string
    
    #endif
    

    【讨论】:

    • 最好传递参数作为参考:inline std::string to_stringAndroid(const T&amp; value)
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2013-10-07
    • 2020-05-23
    • 2014-04-06
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多