Использование Eigen с EIGEN_USE_BLAS в проекте iOS - PullRequest
1 голос
/ 27 сентября 2019

Из образовательных целей я пытаюсь использовать Eigen в своем любимом проекте.Для ускорения математики я включил макрос EIGEN_USE_BLAS, который активирует использование библиотеки blas.

Но я столкнулся с проблемой при попытке загрузить свой проект в Testflight.Ответ Apple на это был:

ITMS-90338: непубличное использование API - приложение ссылается на непубличные символы в My-Project: _saxpy_, _sgemm_, _sgemv_, _strmm_, _strmv_.Если имена методов в вашем исходном коде совпадают с частными API-интерфейсами Apple, перечисленными выше, изменение имен методов поможет предотвратить пометку этого приложения в будущих представлениях.Кроме того, обратите внимание, что один или несколько из перечисленных выше API-интерфейсов могут находиться в статической библиотеке, которая была включена в ваше приложение.Если это так, они должны быть удалены.Для получения дополнительной информации посетите страницу технической поддержки по адресу http://developer.apple.com/support/technical/

Я знаю, что Apple имеет библиотеку blas как часть Accelerate.framework, и ее следует использовать строго через Accelerate API.Но дело в том, что Eigen также имеет свой собственный blas, включенный в их источник, и библиотека на самом деле не намерена использовать Accelerate.framework частные кишки.Вот почему Apple просит меня переименовать эти функции или полностью удалить их, чтобы избавиться от этого неудобства.

Но я даже не уверен, что это можно сделать - настроить Eigen иblas использовать альтернативные имена.

Может быть, есть способ решить эту проблему эффективным способом?Или, может быть, я ничего не знаю об использовании Eigen в среде iOS?

1 Ответ

1 голос
/ 30 сентября 2019

Мне повезло выяснить проблему с помощью нескольких советов от моих коллег-коллег и твердой воли, чтобы выполнить работу, и теперь я хочу поделиться с вами своими выводами.

Проблема: 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 внесет больше ясности в эту проблему и что описания ошибок будут иметь больше смыслав будущем.

...