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

Posted

技术标签:

【中文标题】当我提交带有犰狳的 iOS 应用程序时,BLAS 符号被拒绝为私有(ITMS-90338:非公共 API 使用)【英文标题】:When I submit an iOS app with armadillo, the BLAS symbols are rejected as private (ITMS-90338: Non-public API usage) 【发布时间】:2020-09-09 15:18:21 【问题描述】:

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

ITMS-90338:非公共 API 使用 - 应用引用非公共符号...ddotdgemmdgemvdsyrk.

这些符号来自 BLAS 库并包含在 Accelerate 中,但显然不公开。有没有办法使用犰狳而不出现此错误?

【问题讨论】:

【参考方案1】:

对于 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 并用提供的公共 API 做一些替换(例如https://developer.apple.com/documentation/accelerate/1513282-cblas_dgemm?language=objc)——但这对我的项目来说不是必需的,我没有有时间检查它是否能正常工作(我不得不承认我有更多有趣的空闲时间项目......)

【讨论】:

以上是关于当我提交带有犰狳的 iOS 应用程序时,BLAS 符号被拒绝为私有(ITMS-90338:非公共 API 使用)的主要内容,如果未能解决你的问题,请参考以下文章

使用 GPU 的犰狳 (+BLAS)

犰狳 lapack 和 blas 未定义的参考

将具有外部依赖项的共享库集成到 MATLAB |即犰狳、LAPACK、BLAS

当 B 是犰狳中的对称矩阵时的 A * B 计算

Armadillo 在 iOS 上调用内部加速库

如何将 lapack 和 BLAS 库链接到 C++ 代码