Вы должны использовать стандартизированный atomic_fetch_add
.
В любом случае, похоже, что ваш __atomic_fetch_add
с данным типом аргумента (предположительно, 8-байтовым целым числом) не может быть преобразован в инструкцию (ы) сборки на вашей платформе, поэтому он становится разрешенным вызовом функции для который вам нужно будет связать libatomic
(-latomic
).
Редактировать с деталями:
В gcc __atomic_fetch_add
представляется встроенным компилятором, используемым для реализации stdatomic.h
atomic_fetch_and_explicit
(это просто простое имя макроса для него). Как я уже отмечал, вам действительно следует использовать стандартное имя atomic_fetch_add_explicit
, а не непереносимые детали реализации, которыми является __atomic_fetch_add
.
Несмотря на это, проблема в том, что gcc и clang не реализуют atomic_fetch_and_explicit
с инструкциями по ARM (в отличие от ARM64 или x86-64), но вместо этого они генерируют вызов функции (с использованием глобальной блокировки) из библиотеки libatomic
. Название функции, кажется, получено из числа байтов в целом числе, к которому вы пытаетесь получить fetch_add
(__atomic_fetch_add_8
если вы fetch_adding к _Atomic uin64_t
__atomic_fetch_add_4
если вы fetch_adding к _Atomic uin32_t
и т. Д.).
https://gcc.godbolt.org/z/S67g7b