Android NDK: ошибка компиляции с std::execution в C++17

Я пытаюсь скомпилировать программу на C++, используя Android NDK, основанную на функции C++17 std::execution.

В процессе сборки я сталкиваюсь со следующими ошибками:

error: no member named 'par' in namespace 'std::execution'
error: no member named 'par_unseq' in namespace 'std::execution'

Пример программы:

#include <execution>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::for_each(std::execution::par, vec.begin(), vec.end(), [](int &n) { n *= 2; });
    return 0;
}

Команда компиляции:

/Users/A.Chavez/Library/Android/sdk/ndk/27.0.11902837/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ \
  --target=aarch64-none-linux-android24 \
  --sysroot=/Users/A.Chavez/Library/Android/sdk/ndk/27.0.11902837/toolchains/llvm/prebuilt/darwin-x86_64/sysroot \
  -std=c++20 \
  -stdlib=libc++ \
  -I/Users/A.Chavez/Library/Android/sdk/ndk/27.0.11902837/sources/cxx-stl/llvm-libc++/include \
  -I/Users/A.Chavez/Library/Android/sdk/ndk/27.0.11902837/sources/cxx-stl/llvm-libc++abi/include \
  -I/Users/A.Chavez/Library/Android/sdk/ndk/27.0.11902837/sources/android/support/include \
  -c test.cpp

Контекст: Я установил для APP_CPPFLAGS значение -std=c++20 и для APP_STL значение c++_shared в моем файле CMakeList.txt. Я использую NDK версии 27.0.11902837, но это происходит с любым NDK, который должен поддерживать C++17.

В документации указано, что libc++ должен поддерживать современные функции C++, но кажется, что std::execution может поддерживаться не полностью.

  1. Как устранить эту ошибку и успешно скомпилировать программу с помощью Android NDK?
  2. Требуется ли какая-либо конкретная настройка или дополнительные действия для включения поддержки std::execution?

Я использую CMake для создания проекта.

NDK r27 еще не выпущен. Опубликуйте выпуск здесь

3CxEZiVlQ 27.06.2024 22:18

@3CxEZiVlQ это происходит и с NDK r26, который должен поддерживать C++17.

ILikeTacos 27.06.2024 22:25
1
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Android NDK r27 RC 1 не поддерживает параллельные алгоритмы в libc++ и вы не сможете использовать их в своем коде.

clang-r522817/include/c++/v1/execution

// <...>
#include <__config>
// <...>
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
// <...>

clang-r522817/include/c++/v1/__config

// <...>
#  if __has_feature(experimental_library)
#    ifndef _LIBCPP_ENABLE_EXPERIMENTAL
#      define _LIBCPP_ENABLE_EXPERIMENTAL
#    endif
#  endif
// <...>
#  if !defined(_LIBCPP_ENABLE_EXPERIMENTAL) && !defined(_LIBCPP_BUILDING_LIBRARY)
#    define _LIBCPP_HAS_NO_INCOMPLETE_PSTL
// <...>

_LIBCPP_HAS_NO_INCOMPLETE_PSTL определено. Следовательно, <execution> не определяет политику выполнения.

Большое спасибо за источники, просто любопытно, когда я нажимаю на ваши ссылки, я не вижу этих конкретных строк. Есть ли конкретная редакция, на которую мне следует обратить внимание?

ILikeTacos 27.06.2024 22:54

@ILikeTacos Обновлено. Извините, я ссылался на NDK r26 перед обновлением.

3CxEZiVlQ 27.06.2024 23:13

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

Можно ли определить, не имеет ли перечисление фиксированного базового типа?
Как настроить мои библиотеки и зависимости для компиляции моего приложения как статического
Принципы и практика программирования Страуструпа, 3-е издание, графика: почему передача функции обратного вызова в Window::timer_wait дает неожиданные результаты?
Почему я получаю ошибки «неопределенной ссылки» при попытке использовать OpenCV в Qt Creator с MinGW?
ESP-IDF: Модульные тесты с Unity и C++
Как передать constexpr в конструктор?
При поиске количества точек внутри некоторой фигуры с помощью KD-Tree нужно ли нам проверять пересечение областей или просто сравнивать свойства, соответствующие глубине?
Использование std::enable_if во избежание неоднозначной перегрузки шаблонных бинарных операторов
Арифметическая ошибка, вызванная опцией -O3 в g++
Наследовать сразу или наследовать по одному