架构 arm64 的未定义符号:“cv::String::deallocate()”

Posted

技术标签:

【中文标题】架构 arm64 的未定义符号:“cv::String::deallocate()”【英文标题】:Undefined symbols for architecture arm64: "cv::String::deallocate()" 【发布时间】:2016-01-27 10:46:41 【问题描述】:

当我添加一个包含 opencv.framework 的“.a”文件时,Xcode 遇到了这样的编译错误:

我很确定 opencv.framework 在那里,而且我使用的是 opencv 3.1,它应该已经支持 arm64。但是为什么它一直抱怨这个呢?我该如何解决?非常感谢。

lipo - info 显示以下信息: fat文件中的架构:/Users/Fumin/libVisageWrapper.a是:armv7 i386 x86_64 arm64

【问题讨论】:

在您的项目设置中,您能否确认在链接阶段正在链接库? developer.apple.com/library/mac/recipes/… 是的,我已经仔细检查过了。库正在正确链接。 我刚刚注意到 LD 错误是“未找到架构的符号”,框架是否可能不支持 arm64?例如:它只有 x86/x86_64 支持?还是您使用了错误版本的框架? 最新的OpenCV ios框架默认支持64位,我使用的是iOS版本。 【参考方案1】:

您应该使用以下命令验证库是否正确支持 arm64:

lipo -info libYourLib.a 

此命令的输出应显示如下:

Architectures in the fat file: libYourLib.a are: armv7 arm64 

fat 文件是指一个文件,其中包含可能不止一个架构的二进制元素。

如果缺少 arm64,则无法为 arm64 设备构建目标。您可能需要请您的库供应商构建一个包含 arm64 架构的 fat 版本。

【讨论】:

我用过这个命令,它说支持arm64。所以应该是其他原因导致了这个错误。 fat文件中的架构:/Users/Fumin/libVisageWrapper.a为:armv7 i386 x86_64 arm64 所以@Li Fumin 我们从您下面的回答中了解到,这些“未定义符号”有时可能是由于提供相同 API 的多个 .a 文件造成的。顺便说一句,您可以通过运行otool -P libYourLib.a 了解很多关于 '.a' 文件的内容【参考方案2】:

原来在某个其他库中已经有一个 opencv 库,所以两个实例 opencv 相互冲突。 .a 文件提供程序使用相同的 opencv 库提供新版本后,现在可以正常工作了。

【讨论】:

你能解释一下吗?你采取了哪些步骤? 假设你有两个库文件:“libOne.a”和“libTwo.a”,并且它们都包含相同的opencv库,在这种情况下会有冲突,所以你必须与这两个库提供商之一,告诉他们为您删除 opencv 库,因为在另一个库中已经有一个 opencv 库供您使用。 @Francesco Boi 确认这解决了在 Mac 上从源代码构建 opencv_viz 模块时的问题,通过 Homebrew 在 /usr/local/lib 中安装了旧版本的 OpenCV。要解决这个问题,必须brew uninstall opencv,然后从源代码构建,然后在需要时恢复旧版本。

以上是关于架构 arm64 的未定义符号:“cv::String::deallocate()”的主要内容,如果未能解决你的问题,请参考以下文章

Crashlytics错误:架构arm64的未定义符号

XCode - 架构 armv7 arm64 的未定义符号

架构 arm64 的未定义符号:“cv::String::deallocate()”

删除/重新添加文件,现在我得到架构 arm64 的未定义符号:

Unity AR Foundation Xcode 项目中架构 arm64 的未定义符号

架构 arm64 的未定义符号:Crashlytics (CLSBetaController.o) 中的 CLSBetaController 块调用