2014-09-29 3 views
4

Это может быть дубликат, но я пробовал все решения, которые я нашел и выпадал из StackOverflow.error: 'to_string' не является членом 'std'

Я делаю библиотеку на C++ с OpenCV и пытаюсь ее скомпилировать для Android.

Я не могу использовать to_string(int), но я не могу. Я пытался изменить свой makefile слишком много раз. Моя последняя конфигурация это на:

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=off

OPENCV_INSTALL_MODULES:=on

include $(LOCAL_PATH)/jsoncpp/Android.mk

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

OPENCV_LIB_TYPE:=SHARED

LOCAL_C_INCLUDES += $(LOCAL_PATH)

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

LOCAL_C_INCLUDES += /Users/rafaelruizmunoz/Desktop/RD/OpenCVtry/Libraries/jsoncpp- master/include

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

include $(BUILD_SHARED_LIBRARY)

и это мой Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

APP_ABI := all

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 := true

Спасибо заранее.

+0

Является ли ваш исходный файл, включая '' перед тем, как использовать 'std :: to_string' ...? Если это так, вы можете использовать 'g ++ -E ...', чтобы увидеть вывод препроцессора, и проверить 'to_string' есть ... если не проверить условный' # ifdef' в заголовке и google, который определяет, что вам не хватает. XCode может определять дополнительные символы препроцессора, которые вам нужны ... –

+0

Да, это действительно хорошо работает на XCode. Когда я его компилирую, библиотека отлично работает. –

+0

Хорошо, я собираюсь это сделать –

ответ

6

Android NDK 9+ поставляется с llvm-libc++, который имеет полную поддержку функций cpp11. Чтобы включить его, все, что вам нужно сделать, это изменить их в Application.mk:

APP_CPPFLAGS := -std=c++11 

и

APP_STL:=c++_static 

или

APP_STL:=c++_shared 
+0

Этот stdlib совместим с GCC, а не только с clang, не так ли? –

3

Вы можете попробовать это:

#include <string> 
#include <sstream> 

#if defined(__ANDROID__) 
#define TO_STRING to_stringAndroid 

template <typename T> 
inline std::string to_stringAndroid(T value) 
{ 
    std::ostringstream os ; 
    os << value ; 
    return os.str() ; 
} 


#else 

#define TO_STRING std::to_string 

#endif 
4

Я тоже столкнулся с этим вопросом. to_string недоступен в gnu-libstdC++ «из коробки». Я искал источники и обнаружили, что станд :: to_string действительно в Lib (источники/CXX-СТЛ/гну-libstdC++/4,9/включить/бит/basic_string.h), но отказались от

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

После добавления -D_GLIBCXX_USE_C99 для сборки std :: to_string.

Смежные вопросы