Настройка C++11 (std::thread) для NDK с помощью ADT/Eclipse

Я пытался использовать C++11. Я разрабатываю проект Android, и я хочу использовать std::mutex. Вместе с OpenCV Но что бы я ни делал, я просто не могу исправить Type 'mutex' could not be resolvedошибка.

Я пытался следовать учебникам, которые я нашел на SO и в других местах. LINK1 LINK2 LINK3 LINK4

  1. ADT v22.3.0-887826
  2. Установленные компиляторы C/C++ (CDT)

После стольких уроков это стало настоящим беспорядком. Поэтому я объясню мои текущие настройки

  • Проект> Свойства> Сборка C/C++> Редактор цепочек инструментов
    • Текущая цепочка инструментов "Cross GCC"
    • Текущий строитель - это Android Builder
  • Проект> Свойства> Сборка C/C++> Параметры обнаружения

    • Команда вызова компилятора - "gcc"
    • Аргументы вызова компилятора: -E -P -v -dD "${plugin_state_location}/specs.c -std= C++ 11"
  • Project> C/C++ General> Пути и символы> Вкладка "Символы"

    • Символ = __cplusplus и Значение = 1

В моем файле Application.mk у меня есть следующее

APP_STL := gnustl_static
APP_USE_CPP0X := true
APP_CPPFLAGS := -std=c++11 -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

Я попытался изменить значение символа cplusplus на 201103L и попытался __GXX_EXPERIMENTAL_CXX0X с пустым значением

Но ничего не работает, что я делаю не так??

Любая помощь приветствуется!

3 ответа

Решение

Поддержка для std::thread немного особенным. Проблема рассматривается, например, в этой статье Binglong. Статья действительно короткая, но ее можно обобщить одним предложением:

Вы не можете использовать (по умолчанию) gcc 4.6 toolchain, если хотите #include <thread> или же #include <mutex>,

Итак, пожалуйста, добавьте NDK_TOOLCHAIN_VERSION=4.8 или же NDK_TOOLCHAIN_VERSION=clang на ваш Application.mk,

Чтобы ADT правильно перестроил свой индекс, см. Сборку Android NDK, метод не может быть разрешен или Eclipse успешно компилируется, но все равно выдает семантические ошибки.

В Android.mk добавить LOCAL_CPPFLAGS := -std=c++11 -D __cplusplus=201103L затем пересоберите свой проект (для перенастройки компилятора). После перестройки ваш проект автоматически добавляет необходимый путь STL в Path и символы

Если вы модернизируете NDK или установите новую версию Android Studio (2.1 на момент написания статьи), и Android Studio загрузит NDK для вас, вы получите ревизию 12, в которой много std:: define, не определенное в \ndk-bundle\sources\cxx-stl\gnu-libstdC++\4.9\libs\armeabi-v7a\include\bits\ C++config.h - относящиеся к потокам, такие как _GLIBCXX_HAS_GTHREADS, который скрывает класс потока в "потоке" для пример.

Это говорит о том, что после ревизии 10e этот gcc устарел. И с этим все определения, как упомянуто - которые тщательно глючили наш зависящий от потока код JNI.

Clang, как было предложено в других статьях, не является для нас решением, так как он, помимо прочего, не поддерживает, например, the__local. Решение состоит в том, чтобы вернуться к версии 10e, которую вы можете найти по адресу:

dl.google.com/android/ndk

Извлеките пакет и скопируйте в каталог sdk/ndk-bundle - сначала убедитесь, что вы удалили исходную версию 12.

Другие вопросы по тегам