Cocoapods OpenCV 2.4.10链接错误

25

我试图使用OpenCV 2.4.10构建一个简单的项目,但是我遇到了很多类似以下的错误:

Undefined symbols for architecture x86_64:
  "_jpeg_free_large", referenced from:
      _free_pool in opencv2(jmemmgr.o)
  "_jpeg_free_small", referenced from:
      _free_pool in opencv2(jmemmgr.o)
      _self_destruct in opencv2(jmemmgr.o)

这是ViewController.m文件。

#import "ViewController.h"
#import <opencv2/opencv.hpp>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    cv::Mat greyMat;
}

Podfile

platform :ios, '8.1'

pod 'OpenCV', '2.4.10'

使用2.4.9.1或2.4.9版本时,项目可以顺利构建。
我还能够使用从podspec 2.4.10中找到的URL下载框架文件来构建这个项目。


1
给那位点了踩的人,请说明为什么要这样做。问题还存在。 - Tõnu Samuel
6个回答

18

Bug 4052仍未解决,对于2.4.10也没有pods,因此您必须使用我认为是稳定的2.4.9版本。

如果你使用pods

pod 'OpenCV', '2.4.9'

Pod分发似乎出了问题(SourceForge链接错误)。请参考https://dev59.com/ql0Z5IYBdhLWcg3w0zNX#31226206进行修复。 - foundry

11

以下是一个小技巧。问题在于XCode项目无法链接到libjpeg.a库。因此,在编译项目时会出现上述错误。

按照以下步骤操作:

  1. 访问:[[http://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/]] 并下载 libjpeg-turbo-1.4.0.dmg 文件(3.8 MB)。
  2. 安装该软件包。完成后,您将在以下路径中找到已安装的文件:/opt/libjpeg-turbo/lib
  3. 打开终端并输入以下命令:lipo -info /opt/libjpeg-turbo/lib/libjpeg.a
  4. 如果终端运行命令后显示以下输出,则说明您可以将该库用于iOS项目(armv7 / armv7s)。
    • fat文件中的架构:/opt/libjpeg-turbo/lib/libturbojpeg.a 为:i386 x86_64 armv6 armv7 armv7s arm64*
  5. 使用finder导航至:/opt/libjpeg-turbo/lib,并复制libjpeg.a文件并将其放置在项目文件夹中。
  6. 前往XCode项目 -> 点击项目名称 -> Targets -> General -> Linked frameworks and libraries -> 在底部点击添加按钮-> 包括libjpeg.a文件
  7. 编译项目。它不应再显示任何libjpeg链接器错误。

这个手册很棒!谢谢!我只是从/opt/libjpeg-turbo/lib中添加了libjpeg.a到我的项目中。但是我不得不在项目设置中禁用位码选项。因为据我所知,该库已经编译时没有使用位码选项。 - Vladimir Vlasov
我最近开始探索在iOS上使用OpenCV,发现添加libjpeg.a到我的项目的推荐指令并没有解决问题。我得到了许多重复的符号,而不是未定义的符号。我想出了一个解决方法,就是下载OpenCV源代码并获取以下8个文件,然后将它们添加到我的iOS项目中。这样做的效果是定义了由jmemansi.c导出的符号。我对XCode或OpenCV中使用的构建系统了解不够,无法进行更优雅的修复,但我想传递一下对我有效的解决方案。 - Jamie Fenton
我复制到我的项目中的文件列表:jconfig.h jinclude.h memsys.h jpegint.h jerror.h memansi.c jmorecfg.h jpeglib.h - Jamie Fenton

5
似乎当前iOS版本的OpenCV存在问题。可能需要继续使用2.4.9版本。详情请参见Bug #4052

无法使用2.4.9版本,因为现在应用程序需要64位。 - ahwulf

2
我没有解决这个问题的方法,但我有一个解决方法。我从这里下载了项目,并将该项目中的框架和头文件复制到我的项目中。enter image description here

2
我已经将OpenCV的新版本(2.4.11、2.4.12、2.4.12.3、3.0.0)添加到CocoaPods中。
2.4.11、2.4.12和2.4.12.3需要链接libjpeg,因此现在Pod实际上会下载repo,从源代码编译,然后链接libjpeg,除了opencv2.framework文件。现在通过CocoaPods可以直接使用,但是由于它是从源代码编译的,所以在执行pod install时需要一些时间。只要确保在编译过程中不要取消它(CocoaPods中存在一个bug,如果取消了就会出问题)。
在幕后,3.0.0的工作方式与之前的版本相同,使用预编译的opencv2.framework文件,并且现在可以通过CocoaPods安装。
版本2.4.10仍然无法在CocoaPods中正常工作,但由于该版本在我的机器上从源代码编译时会出错,所以我没有太多办法。
(注:我不是该Pod的原始维护者,我仅仅贡献了这些新版本。)

遗憾的是,即使使用一个非常简单的 Podfile,这些都不起作用:http://pastebin.com/hbjNTF9H - shmim
shmim,这很奇怪。当您访问http://download.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip时会发生什么?您能够下载该文件吗? - Kyle Fleming
当我发表评论时,sourceforge链接无法使用,但现在似乎可以使用了。我以前听说过这种情况发生过...3.0下载,我假设它可以工作,尽管我还没有测试过。然而,版本2.4.11、2.4.12和2.4.12.3都会抛出编译器错误:https://paste.ee/p/ACvj0 - shmim

1

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