C++ atomic: ошибка LLVM из NDK

124
21 ноября 2020, 08:10

При включении любых C++ заголовков появляется ошибка в заголовках LLVM:

In file included from ./test.cpp:4:
In file included from C:/__BuildSource/__LIB__/android-ndk-r20-beta2/build//../sources/cxx-stl/llvm-libc++/include\algorithm:644:
In file included from C:/__BuildSource/__LIB__/android-ndk-r20-beta2/build//../sources/cxx-stl/llvm-libc++/include\memory:668:
C:/__BuildSource/__LIB__/android-ndk-r20-beta2/build//../sources/cxx-stl/llvm-libc++/include\atomic:1167:49: error: expected ')'
atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
                                                ^
C:/__BuildSource/__LIB__/android-ndk-r20-beta2/build//../sources/cxx-stl/llvm-libc++/include\atomic:1167:1: note: to match this '('
atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
^
C:/__BuildSource/__LIB__/android-ndk-r20-beta2/build//../toolchains/llvm/prebuilt/windows\lib\clang\8.0.7\include\stdatomic.h:250:68: note: expanded from macro 'atomic_is_lock_free'
#define atomic_is_lock_free(obj) __c11_atomic_is_lock_free(sizeof(*(obj)))
                                                               ^

нашел похожую проблему, но она не содержит ответа https://stackoverflow.com/questions/38015275/libbinder-static-compile-error-ndk11c-api-21
NDK последний android-ndk-r20-beta2

Код на что ругается: cxx-stl/llvm-libc++/include/atomic

// atomic_is_lock_free
template <class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
bool
atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
{
    return __o->is_lock_free();
}

Где то там еще одноименный макрос определен.. #define atomic_is_lock_free

Answer 1

Workaround данного бага - правим файл sources/cxx-stl/llvm-libc++/include/memory:

#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) /// строка 667
#  include <atomic>                        /// добавляем
//#  include <stdatomic.h>                 /// комментируем
#endif

и все начинает собираться.

Для понимания что дело не в коде:

test.cpp

#include <atomic>
#include <memory>
int main(int argc, char **argv) { return 0; }

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := teZt
LOCAL_CPP_EXTENSION := .cpp
LOCAL_SRC_FILES := test.cpp
LOCAL_LDFLAGS := 
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := ./
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_MODULE_TAGS := eng
LIBCXX_FORCE_REBUILD := false
LOCAL_CPP_FEATURES := rtti
LOCAL_CPPFLAGS := -std=c++17 -Wall
include $(BUILD_EXECUTABLE)
READ ALSO
Отличить текст от ссылки

Отличить текст от ссылки

Есть форма ввода YouTubeВ неё можно ввести поисковой запрос или вставить ссылку на видео YouTube

129
Блокировка Коллекции

Блокировка Коллекции

Мне нужно сделать блокировку чтения и записи, при этом, во время чтения происходит удаление элементов из коллекции List

95
Установка конкретных битов в байте. C#

Установка конкретных битов в байте. C#

Необходимо в байт записывать конкретные битыПричем данные еще разбиты на 4 кадра

102