I’m missing something minor here in my project using the OpenCV framework from a working demo.
Steps to reproduce:
-
Download the example app from http://aptogo.co.uk/2011/09/opencv-framework-for-ios/
-
Create a new Titainum iOS module with titanium create –platform=iphone –type=module –dir=. –name=opencv –id=opencv
-
Open the XCode project, drag in the OpenCV framework from the FaceTracker app and the other required frameworks.
-
Add OTHER_LDFLAGS=$(inherited) -framework OpenCV to module.xcconfig
-
Create new TiUIView and TiUIViewProxy classes named OpencvView and OpencvViewProxy.
-
In the new OpencvView class, instantiate a UIViewController that uses OpenCV.
The build will build the Titanium module, but when I try to run the module test harness, I get these errors for OpenCV objects:
Undefined symbols for architecture i386:
“_CMSampleBufferGetImageBuffer”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CMSampleBufferGetOutputPresentationTimeStamp”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CMTimeMake”, referenced from:
-[VideoCaptureViewController createCaptureSessionForCamera:qualityPreset:grayscale:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferGetBaseAddress”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferGetBaseAddressOfPlane”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferGetHeight”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferGetPixelFormatType”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferGetWidth”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferLockBaseAddress”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“_CVPixelBufferUnlockBaseAddress”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
“cv::_InputArray::_InputArray(cv::Mat const&)”, referenced from:
-[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::_OutputArray::_OutputArray(cv::Mat&)”, referenced from:
-[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::CascadeClassifier::load(std::string const&)”, referenced from:
-[DemoVideoCaptureViewController viewDidLoad] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::CascadeClassifier::CascadeClassifier()”, referenced from:
-[DemoVideoCaptureViewController .cxx_construct] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::CascadeClassifier::~CascadeClassifier()”, referenced from:
-[DemoVideoCaptureViewController .cxx_destruct] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::Mat::deallocate()”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
-[UIImage(UIImage_OpenCV) CVMat] in libopencv.a(UIImage+OpenCV.o)
-[UIImage(UIImage_OpenCV) CVGrayscaleMat] in libopencv.a(UIImage+OpenCV.o)
“cv::Mat::create(int, int const*, int)”, referenced from:
-[UIImage(UIImage_OpenCV) CVMat] in libopencv.a(UIImage+OpenCV.o)
-[UIImage(UIImage_OpenCV) CVGrayscaleMat] in libopencv.a(UIImage+OpenCV.o)
“cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)”, referenced from:
-[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::resize(cv::_InputArray const&, cv::OutputArray const&, cv::Size, double, double, int)”, referenced from:
-[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] in libopencv.a(DemoVideoCaptureViewController.o)
“cv::fastFree(void*)”, referenced from:
-[VideoCaptureViewController captureOutput:didOutputSampleBuffer:fromConnection:] in libopencv.a(VideoCaptureViewController.o)
-[UIImage(UIImage_OpenCV) CVMat] in libopencv.a(UIImage+OpenCV.o)
-[UIImage(UIImage_OpenCV) CVGrayscaleMat] in libopencv.a(UIImage+OpenCV.o)
“cv::transpose(cv::_InputArray const&, cv::_OutputArray const&)”, referenced from:
-[DemoVideoCaptureViewController processFrame:videoRect:videoOrientation:] in libopencv.a(DemoVideoCaptureViewController.o)
“_kCVPixelBufferPixelFormatTypeKey”, referenced from:
-[VideoCaptureViewController createCaptureSessionForCamera:qualityPreset:grayscale:] in libopencv.a(VideoCaptureViewController.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I had a similar problem with the default apple llvm compiler on Xcode 4.5.1. Try changing it to gcc (from your build options) and see if this works.