无法让 OpenCV 框架符号在 XCode 中链接

Posted

技术标签:

【中文标题】无法让 OpenCV 框架符号在 XCode 中链接【英文标题】:Trouble getting OpenCV framework symbols to link in XCode 【发布时间】:2012-12-14 16:03:44 【问题描述】:

我在项目中使用工作演示中的 OpenCV 框架遗漏了一些小东西。

重现步骤:

    从http://aptogo.co.uk/2011/09/opencv-framework-for-ios/下载示例应用

    使用 Titan create --platform=iphone --type=module --dir= 创建一个新的 Titainum iOS 模块。 --name=opencv --id=opencv

    打开 XCode 项目,从 FaceTracker 应用程序和其他所需框架中拖入 OpenCV 框架。

    将 OTHER_LDFLAGS=$(inherited) -framework OpenCV 添加到 module.xcconfig

    创建名为 OpencvView 和 OpencvViewProxy 的新 TiUIView 和 TiUIViewProxy 类。

    在新的 OpencvView 类中,实例化一个使用 OpenCV 的 UIViewController。

构建将构建 Titanium 模块,但是当我尝试运行模块测试工具时,我收到 OpenCV 对象的以下错误:

架构 i386 的未定义符号: “_CMSampleBufferGetImageBuffer”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CMSampleBufferGetOutputPresentationTimeStamp”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CMTimeMake”,引用自: -[VideoCaptureViewController createCaptureSessionForCamera:qualityPreset:grayscale:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferGetBaseAddress”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferGetBaseAddressOfPlane”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferGetHeight”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferGetPixelFormatType”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferGetWidth”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferLockBaseAddress”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “_CVPixelBufferUnlockBaseAddress”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) “cv::_InputArray::_InputArray(cv::Mat const&)”,引用自: -[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::_OutputArray::_OutputArray(cv::Mat&)”,引用自: -[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::CascadeClassifier::load(std::string const&)”,引用自: - [DemoVideoCaptureViewController viewDidLoad] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::CascadeClassifier::CascadeClassifier()”,引用自: -[DemoVideoCaptureViewController .cxx_construct] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::CascadeClassifier::~CascadeClassifier()”,引用自: -[DemoVideoCaptureViewController .cxx_destruct] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::Mat::deallocate()”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) -[UIImage(UIImage_OpenCV) CVMat] 在 libopencv.a(UIImage+OpenCV.o) -[UIImage(UIImage_OpenCV) CVGrayscaleMat] 在 libopencv.a(UIImage+OpenCV.o) “cv::Mat::create(int, int const*, int)”,引用自: -[UIImage(UIImage_OpenCV) CVMat] 在 libopencv.a(UIImage+OpenCV.o) -[UIImage(UIImage_OpenCV) CVGrayscaleMat] 在 libopencv.a(UIImage+OpenCV.o) “cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)”,引用自: -[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::resize(cv::_InputArray const&, cv::OutputArray const&, cv::Size, double, double, int)”,引用自: -[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] 在 libopencv.a(DemoVideoCaptureViewController.o) “cv::fastFree(void*)”,引用自: -[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] 在 libopencv.a(VideoCaptureViewController.o) -[UIImage(UIImage_OpenCV) CVMat] 在 libopencv.a(UIImage+OpenCV.o) -[UIImage(UIImage_OpenCV) CVGrayscaleMat] 在 libopencv.a(UIImage+OpenCV.o) “cv::transpose(cv::_InputArray const&, cv::_OutputArray const&)”,引用自: -[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] 在 libopencv.a(DemoVideoCaptureViewController.o) “_kCVPixelBufferPixelFormatTypeKey”,引用自: -[VideoCaptureViewController createCaptureSessionForCamera:qualityPreset:grayscale:] 在 libopencv.a(VideoCaptureViewController.o) ld:未找到体系结构 i386 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

【问题讨论】:

您是否要为模拟器构建?我怀疑您下载的框架仅适用于 ARM 处理器。 我也开始这么想了。但是,我尝试在 Titanium Studio 中使用该模块并直接安装到设备上。我得到了相同类型的“SystemExit:65”错误。是否可以开发一个使用仅为设备构建的框架的 Ti iOS 模块? 嗨乔,你解决了吗?在为 Titanium Appcelerator 构建时,我面临着同样的问题。模块构建正确,但是当我尝试编译和运行应用程序时,出现此错误。 【参考方案1】:

我有类似的错误。而且仅仅改变“构建设置”并没有帮助。

最后,我通过添加一些框架(如 coreMedia、coreVideo 等)解决了这个问题。 但是,我的代码中没有使用这些框架。

所以我猜 openCV 需要这些框架。但我不知道为什么。

希望这会有所帮助:)

【讨论】:

【参考方案2】:

我在 Xcode 4.5.1 上使用默认的 Apple llvm 编译器时遇到了类似的问题。尝试将其更改为 gcc(从您的构建选项中),看看是否可行。

【讨论】:

嗨。我有一个问题,就像这个问题中的问题一样。请问,如何将我的编译器更改为 GCC?我使用的是 Xcode 11.3.1,Compiler for C/C++/Objective-C 上有两个选项,即Default Compiler (Apple Clang)OtherOther 字段需要手动输入一些关于编译器的信息。请帮帮我,我该怎么做?

以上是关于无法让 OpenCV 框架符号在 XCode 中链接的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8.2 无法从添加的搜索路径中找到头文件?

捆绑框架与XCode中的应用程序

架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用

XCode 找不到特定 iOS 库/框架项目的符号

未找到体系结构 i386 Xcode 6.4 的符号

Xcode中的重复符号错误