Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Undefined symbols cv::_OutputArray::_OutputArray(std::__1::vector<cv::mat, std::__1::allocator<cv::mat=""> >&)

Hi everyone. I've been trying to incorporate OpenCV into a Kinect project I have going on OS X Mountain Lion (Xcode 4.6, OpenCV 2.4.7).

Everything seemed to be going fine until I tried calling cv::calibrateCamera, which seems to require output args of class OutputArrayOfArrays. In the examples I see that references to std::vector<cv::mat> are passed in. The code compiles fine, but fails on the link with the following error:

Undefined symbols for architecture x86_64:  
  "cv::_OutputArray::_OutputArray(std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)"

I've read that such errors might be because of a discrepancy between the c++ library against which the opencv libraries are linked and that against which the app code is linked. I've tried switching to libstdc++ in Xcode, and that seems to generate a whole slew of other errors which lead me to think that opencv 2.4.7 was updated with c++11 in mind?

So, just in case, I went back and reconfigured the opencv build with the following.

cmake -D CMAKE_CXX_COMPILER=/Applications/ -D CMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" -D LLVM_ENABLE_CXX11=ON -D CMAKE_SHARED_LINKER_FLAGS="-lc++"

Unfortunately, I'm still getting the linker error. I don't think it's because I'm missing a library because this is a template invocation, so the code is generated at compile time, no? The code that seems to be causing the problem is as follows.

vector<cv::Mat> rVecs, tVecs;
double tResult = cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rVecs, tVecs, flag);

Is there something wrong with my syntax? Am I missing some kind of typename qualifier or something?

I've been banging my head against this for a couple of days now and would deeply appreciate any insight anyone may have.