Мне повезло выяснить проблему с помощью нескольких советов от моих коллег-коллег и твердой воли, чтобы выполнить работу, и теперь я хочу поделиться с вами своими выводами.
Проблема: Eigen не имеет бинарного файла BLAS
, он имеет только свои заголовки.И когда кто-то использует макрос EIGEN_USE_BLAS
и он действительно работает, это означает, что Apple связывает функции Eigen BLAS с их двоичным файлом - BLAS
двоичным файлом, который является частью Accelerate.framework
.Самое сложное в том, что ваш проект не обязательно должен иметь Accelerate.framework
внутри.XCode автоматически добавит необходимые файлы, и, конечно, вам не стоит об этом говорить.
Самое странное для меня здесь то, что использование «голого» * 1012 *, предоставленного Apple Accelerate.framework
, является очевиднымнарушение, потому что это частный API.Так что ... с моей точки зрения это своего рода XCode нарушает это правило без моего намерения и ничего мне об этом не говорит.Странно ...
Итак, чтобы исправить это, вам нужно собрать BLAS
или OpenBLAS
бинарный файл (я построил OpenBLAS
), добавить его в проект и связать через Other linker flags
в Build settings
.После этого ошибка исчезнет, и вы сможете загрузить свою сборку в Testflight.
Чтобы сэкономить ваше время на сборку OpenBLAS
для iOS
, я оставлю вам несколько ссылок.Я думаю, что этого будет достаточно:
http://www.programmersought.com/article/2638161057/ - очень понятное руководство по сборке OpenBLAS
https://github.com/xianyi/OpenBLAS/tree/release-0.2.21 - исходный код библиотеки https://github.com/xianyi/OpenBLAS/issues/1531 - обсуждениегде вы можете найти решения проблем, с которыми вы можете столкнуться
Что мне показалось самой запутанной частью всей этой истории, так это сообщение от Apple.Вот еще одна копия этого:
ITMS-90338: непубличное использование API - приложение ссылается на непубличные символы в My-Project: saxpy , sgemm , sgemv , strmm , strmv .Если имена методов в вашем исходном коде совпадают с частными API-интерфейсами Apple, перечисленными выше, изменение имен методов поможет предотвратить пометку этого приложения в будущих представлениях.Кроме того, обратите внимание, что один или несколько из перечисленных выше API-интерфейсов могут находиться в статической библиотеке, которая была включена в ваше приложение.Если это так, они должны быть удалены.Для получения дополнительной информации посетите страницу технической поддержки по адресу http://developer.apple.com/support/technical/
Я не являюсь носителем английского языка, но я чувствую себя довольно уверенно, говоря, что этот текст не имеет смысла и не имеет абсолютно никакого отношения кделать с решением актуальной проблемы.
Это абсолютно ничего не говорит о том факте, что частный API был связан с моим кодом, и в этом проблема.И что мне нужно предоставить свой собственный бэкэнд для этих функций, чтобы ошибка исчезла.В нем говорится о сопоставлении имен и о том, что изменение моих имен поможет решить проблему, тогда как в моем случае это явно не так.
Я надеюсь, что Apple внесет больше ясности в эту проблему и что описания ошибок будут иметь больше смыслав будущем.