Visual Studio C ARM — ошибка сборки при использовании тригонометрических функций

#c #visual-studio #arm #.so

#c #visual-studio #arm #.итак

Вопрос:

Я создавал динамическую библиотеку (файл .so) для Android в Visual Studio. Недавно я столкнулся с проблемой в названии. Я тестировал это с помощью функций asin, cos и atan2. Я попытался создать пустой проект, чтобы проверить, была ли ошибка вызвана чем-то другим в проекте, но она сохранялась. Что я нахожу особенно странным, так это то, что по крайней мере для asin, если я удостоверяюсь, что аргумент находится в диапазоне [-1, 1], как показано ниже, ошибка прекращается.

 double r31 = complicatedAlgorithm();
if (r31 > 1)
    r31 = 1;
if (r31 < -1)
    r31 = -1;
double result = asin(r31);
  

Я не смог повторить это поведение с cos и atan2.

Конфигурация

  • Clang 5.0
  • Статическая библиотека STL GNU (не выполняется при выборе по умолчанию, но это не вариант для моего проекта)

Сообщения об ошибках

  • Неопределенная ссылка на ‘asin’
  • clang.exe : ошибка: команда компоновщика завершилась ошибкой с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
  • Идентификатор __fp16 не определен (только в основном проекте. В тестовом проекте я этого не получил, но в остальном поведение такое же).

Наблюдения

  • Решение clamp для asin не работает, если компилятор не выполняет оптимизацию (режим-O0)
  • Если код сжатия преобразуется в функцию, которая возвращает ограниченное значение, ошибка прекращается, но если значение передается по ссылке, ошибка сохраняется.
  • Добавление флага -mfp16-format=ieee, который я видел в Интернете, вызывает ошибку неизвестного аргумента.
  • Для cos: если аргумент задан напрямую (например, cos(1)) или если это переменная, значение которой известно во время компиляции, ошибка не выдается.
  • Использование asinf, cosf и atan2f не решило проблему.