Настройка C++11 (std::thread) для NDK с помощью ADT/Eclipse
Я пытался использовать C++11. Я разрабатываю проект Android, и я хочу использовать std::mutex. Вместе с OpenCV Но что бы я ни делал, я просто не могу исправить Type 'mutex' could not be resolved
ошибка.
Я пытался следовать учебникам, которые я нашел на SO и в других местах. LINK1 LINK2 LINK3 LINK4
- ADT v22.3.0-887826
- Установленные компиляторы 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.