#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 не решило проблему.