在真实设备上编译带有openCV框架的iOS应用程序时出现错误

6

使用最新的OpenCV框架时,我无法在iOS设备上编译代码。我遇到了以下错误:

Undefined symbols for architecture arm64: "_png_init_filter_functions_neon", referenced from: _png_read_filter_row in opencv2(pngrutil.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

同样的应用程序可以编译模拟器,但无法编译iOS设备。有谁能告诉我为什么会出现这个问题?提前感谢。


4
谢谢你的回复。我知道有些差异和错误。是的,我从同一个地方下载。3.0版本运行良好,但3.1版本出了问题。 - shahzaib
大家好,我也有同样的问题。OpenCV框架版本3.1不能在其他设备上存档,尽管我们可以在真实设备上进行调试和测试,但无法存档应用程序。有人知道出了什么问题吗?还是我做错了什么? - Rahul Shirphule
@RahulShirphule 你需要从Github下载代码,并重新编译以启用64位设备。我自己没有尝试过,也不知道为什么OpenCV开发人员还没有这样做。 - shahzaib
这真是太奇怪了。我也是这样。版本3.0可以工作,但3.1不能。 - Lukas
@Goz 请点击此链接 http://stackoverflow.com/questions/18976893/how-to-compile-opencv-for-ios7-arm64。另外需要注意的是,IOS上的OpenCV版本3.1和3.0是相同的。 - shahzaib
显示剩余4条评论
3个回答

2

我已经解决了这个问题。这个问题的核心是我们重新编译了libpng中的一些内容,可能存在于其他iOS框架中。这导致了冲突。Opncv 3.1代码中有第三方内容。您需要做的就是找到libpng的pngpriv.h文件中的117-121行,然后按照Iphone - device - linker error进行操作。


2
看起来这个提交修复了问题,同时仍然保持iOS设备的NEON支持:
https://github.com/opencv/opencv/commit/262a52f3063c50fbb1236e2cba2bd3c68f9979bb
基本上,将-DENABLE_NEON=ON附加到cmake行的条款只适用于以"armv"开头的架构(请注意“v”);上述提交更改了opencv/platforms/ios/build_framework.py,使cmake命令也能够与"arm64"一起使用。
之前的内容:
    if arch.startswith("armv"):
        cmakecmd.append("-DENABLE_NEON=ON")

之后:

    if arch.startswith("armv") or arch.startswith("arm64"):
        cmakecmd.append("-DENABLE_NEON=ON")

诊断过程,可能会有用:

在调用 python ../opencv/platforms/ios/build_framework.py ios 之前启动 script build.log 并查看输出;发现 arm_init.c 没有为 arm64 构建(其中定义了 png_init_filter_functions_neon),但是已经为 armv7armv7s 构建。从那里开始,查看 3rdparty/libpng/CMakeLists.txt,指向未设置 ENABLE_NEON


1
将此提交挑选到3.1分支中是否解决了问题? - Captain Jack sparrow

1
我遇到了与@shahzaib描述的相同的问题。在模拟器中可以工作,但在iPhone上无法工作并显示相同的错误。
之前我在我的iOS项目中手动添加了OpenCV 3.1。后来我改变了它,并通过cocoapod https://cocoapods.org/pods/OpenCV 安装了OpenCV库。
而且在cocoapod中有3.1.0.1版本,修复了这个问题。
  pod 'OpenCV', '~> 3.1.0.1'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接