当我使用犰狳提交 iOS 应用程序时,BLAS 符号被拒绝为私有(ITMS-90338:非 public API 用法)

When I submit an iOS app with armadillo, the BLAS symbols are rejected as private (ITMS-90338: Non-public API usage)

我有一个应用程序使用犰狳库进行一些矩阵计算。它针对 Accelerate.framework 编译得很好,但在应用程序商店被拒绝:

ITMS-90338:非 public API 用法 - 应用程序引用非 public 符号...ddotdgemm, dgemv, dsyrk.

这些符号来自 BLAS 库并包含在 Accelerate 中,但显然不是 public。有没有办法在不出现此错误的情况下使用犰狳?

对于 iOS,提交应用商店时出现的一个问题是除非您告诉犰狳库不要使用 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 链接到犰狳的任何位置并注释掉第 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

这意味着您现在可以在没有 BLAS 的情况下使用犰狳,并且应用商店不会拒绝二进制文件。如果您想使用 BLAS,您可以查看 wrapper_blas.h 和 def_blas.h 并用提供的 public API 进行一些替换(例如 https://developer.apple.com/documentation/accelerate/1513282-cblas_dgemm?language=objc) - 但这对我的项目来说不是必需的,我没有时间检查它是否能正常工作(而且我不得不承认我有更多有趣的空闲时间项目...)