在iOS项目中将EIgen与EIGEN_USE_BLAS一起使用

问题描述 投票:1回答:1

出于教育目的,我试图在宠物项目中使用Eigen。为了加快数学速度,我加入了EIGEN_USE_BLAS宏,该宏可激活blas库的使用。

但是当我尝试将项目上传到Testflight时遇到了一个问题。苹果对此的回应是:

ITMS-90338:非公开API用法-该应用引用了非公开API我的项目中的符号:_saxpy _,_ sgemm _,_ sgemv _,_ strmm_,_strmv_。如果源代码中的方法名称与私有Apple相匹配上面列出的API,更改您的方法名称将有助于防止这种情况应用程序,不会在以后的提交中被标记。此外,请注意以上一个或多个API可能位于静态库中,已包含在您的应用中。如果是这样,则必须将其删除。为了更进一步的信息,请访问技术支持信息,网址为:http://developer.apple.com/support/technical/

[我知道Apple将blas库作为Accelerate.framework的一部分,应该严格通过Accelerate API使用它。但事实是,Eigen在其源代码中也包含了自己的blas,而该库实际上无意使用Accelerate.framework私有胆量。因此,Apple要求我重命名这些功能或将其完全删除,以消除不便之处。

但是我什至不确定是否可以做到-调整Eigen及其blas以使用替代名称。

也许有一种以某种有效的方式解决该问题的方法吗?或者,也许我对iOS环境中的本征用法一无所知?

ios eigen blas accelerate-framework
1个回答
1
投票

我很幸运地从同事那里得到了一些建议,并有完成工作的强烈意愿,现在我想与大家分享我的结论。

问题: Eigen没有提供BLAS二进制文件,它只有标题。当使用EIGEN_USE_BLAS宏并且它确实起作用时,这意味着Apple将Eigen BLAS函数链接到其二进制文件-BLAS二进制文件,该二进制文件是Accelerate.framework的一部分。最棘手的部分是您的项目中不一定必须包含Accelerate.framework。 XCode会自动添加必要的文件,当然也不会告诉您。

[最让我感到奇怪的是,使用Apple的BLAS提供的“裸” Accelerate.framework显然是违反的,因为它是私有API。所以...从我的角度来看,某种XCode出于我的意图违反了该规则,并且对此一无所知。奇怪...

因此,为了修复它,您需要构建BLASOpenBLAS二进制文件(我已经构建了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-讨论,您可以在其中找到可能遇到的问题的解决方案

我发现整个故事中最令人困惑的部分是来自苹果的消息。这是它的另一个副本:

ITMS-90338:非公开API用法-该应用引用了非公开API我的项目中的符号:saxpysgemmsgemvstrmmstrmv。如果源代码中的方法名称与列出的私有Apple API匹配以上,更改您的方法名称将有助于防止该应用在将来的提交中被标记。此外,请注意上面的更多API可能位于一个静态库中,包含在您的应用中。如果是这样,则必须将其删除。为了更进一步的信息,请访问技术支持信息,网址为:http://developer.apple.com/support/technical/

我不是英语为母语的人,但是我很自信地说这段文字是无稽之谈,与解决实际问题完全没有关系。

它完全不说私有API链接到我的代码这一事实,这就是问题所在。我需要为这些功能提供自己的后端,以使错误消失。它说了有关名称匹配的问题,并且更改我的姓名将有助于解决问题,而在我看来显然不会。

我希望苹果公司能够使这个问题更加清晰,并且将来的错误描述将​​更加有意义。

© www.soinside.com 2019 - 2024. All rights reserved.