ios - 使用适用于 iOS 的 OpenCV 框架的 Apple Mach-O Linker (Id) 错误

标签 ios xcode opencv objective-c++

我在 iOS 上的 opencv 项目出现了其他问题。

所以我有一个用 Ojective C 编写的小项目,其中有 2 个用 C++ 编写的方法:

我的 ViewController.hh 文件:

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface ViewController : UIViewController

static UIImage* MatToUIImage(const cv::Mat& m);
static void UIImageToMat(const UIImage* image, cv::Mat& m);
@end

和我的 ViewController.mm 文件:

#import "ViewController.hh"

@interface ViewController ()

@end

@implementation ViewController

static UIImage* MatToUIImage(const cv::Mat& m) {
    CV_Assert(m.depth() == CV_8U);
    NSData *data = [NSData dataWithBytes:m.data length:m.elemSize()*m.total()];
    CGColorSpaceRef colorSpace = m.channels() == 1 ?
    CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(m.cols, m.cols, m.elemSize1()*8, m.elemSize()*8,
                                        m.step[0], colorSpace, kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault,
                                        provider, NULL, false, kCGRenderingIntentDefault);
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef); CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace); return finalImage;
}

static void UIImageToMat(const UIImage* image, cv::Mat& m) {
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols = image.size.width, rows = image.size.height;
    m.create(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
    CGContextRef contextRef = CGBitmapContextCreate(m.data, m.cols, m.rows, 8, m.step[0], colorSpace, kCGImageAlphaNoneSkipLast |kCGBitmapByteOrderDefault);
    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef); CGColorSpaceRelease(colorSpace);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSString* filename = [[NSBundle mainBundle] pathForResource:@"cmc7" ofType:@"jpg"];
    UIImage *image = [UIImage imageWithContentsOfFile:filename];

    //cv::Mat inputMat = self.UIImageToMat(image);
    cv::Mat mat;
    UIImageToMat(image, mat);
    UIImage *newImage = MatToUIImage(mat);

    self.view.backgroundColor = [UIColor colorWithPatternImage:newImage];
}

我以这种方式包含我的 opencv 框架:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

我确切地说,我有一个类似的项目,包含相同的内容,但使用的方法是用 Objective C 编写的,而不是用 C++ 编写的,而且它有效。

所以这是我的日志错误。

Undefined symbols for architecture i386:
  "cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)", referenced from:
      __ZL12MatToUIImageRKN2cv3MatE in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

那么问题是什么?我真的更喜欢用 C++ 编写方法,因为使用 C++ 语言而不是 Objective C 来使用 openCV 更常见。

非常感谢。

最佳答案

也许您的项目没有链接到 C++ 运行时库

Build Phases > Link Binary With Libraries > + button > 为 OpenCV 2.4.3 选择“libc++.dylib”,或者

OpenCV 2.4.2 及之前版本的“libstdc++.dylib”。

重建应该可行

关于ios - 使用适用于 iOS 的 OpenCV 框架的 Apple Mach-O Linker (Id) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15094526/

相关文章:

java - 使用 JavaFX 显示 OpenCV Mat

ios - Objective-C : How to remove a white background from a JPG image without losing edge quality

ios - 恢复应用内购买错误 : restores even if not purchased

ios - 验证使用两个不同参数调用方法两次

iphone - Facebook SDK Login 启动一个新的 ViewController

c++ - 内存泄漏在哪里

c++ - cv::Mat 对象中的空数据字段

iphone - COUNT (*) 给出 EXC_BAD_ACCESS

ios - 如何在 Xcode 4.3 中成功使用 BOOL

php - 如何根据用户输入填充表格 View