Когда я отправляю приложение iOS с armadillo, символы BLAS отклоняются как частные (ITMS-90338: непубличное использование API)

#ios #armadillo

#iOS #armadillo

Вопрос:

У меня есть приложение, которое использует библиотеку armadillo для выполнения некоторых матричных вычислений. Он отлично компилируется с Accelerate.framework, но отклоняется в app Store:

ITMS-90338: непубличное использование API — приложение ссылается на непубличные символы … ddot, dgemm, dgemv, dsyrk.

Эти символы взяты из библиотеки BLAS и включены в Accelerate, но, по-видимому, не являются общедоступными. Есть ли способ использовать armadillo без получения этой ошибки?

Ответ №1:

Для iOS одна из проблем, которая возникает при отправке в app Store, заключается в том, что вы получите отказ, если не сообщите библиотеке armadillo, чтобы она НЕ использовала BLAS.

Вы также можете получить то же самое для любого из этих символов:

 _sasum_ _dasum_ _snrm2_ _dnrm2_ _sdot_ _ddot_ 
_sgemv_ _dgemv_ _cgemv_ _zgemv_ _sgemm_ _dgemm_ 
_cgemm_ _zgemm_ _ssyrk_ _dsyrk_ _cherk_ _zherk_
  

Все они используются BLAS для более быстрого вычисления матрицы, но на самом деле не являются необходимыми для базовой функциональности. Чтобы отключить BLAS, перейдите в armadillo_bits/config.hpp, где бы вы ни ссылались на armadillo, и закомментируйте строку 26:

 #if !defined(ARMA_USE_BLAS)
//#define ARMA_USE_BLAS
//// Comment out the above line if you don't have BLAS or a high-speed replacement for BLAS,
//// such as OpenBLAS, GotoBLAS, Intel MKL, AMD ACML, or the Accelerate framework.
//// BLAS is used for matrix multiplication.
//// Without BLAS, matrix multiplication will still work, but might be slower.
#endif
  

Теперь это будет означать, что вы можете использовать armadillo без BLAS, и App Store не отклонит двоичный файл. Если вы ХОТИТЕ использовать BLAS, вы могли бы посмотреть в wrapper_blas.h и def_blas.h и выполнить некоторую замену с помощью предоставленного общедоступного API (например.https://developer.apple.com/documentation/accelerate/1513282-cblas_dgemm ?language = objc) — но это не было необходимо для моего проекта, и у меня не было времени проверить, будет ли все это работать (и я должен признать, что у меня есть более интересные проекты в свободное время …)