c++ - OpenCV,XCode 中的链接错误,体系结构 x86_64 的 undefined symbol : "_cvHaarDetectObjects", 从 : _main in main. o 引用

标签 c++ xcode opencv clang face-detection

我正在尝试将 openCV (v 2.4.6) 用于 macOSX (v 10.7.4) 和 Xcode (v 4.6.2)。

我已经使用 cmake 正确安装了库(我想,我没有任何错误,所以...),安装后我开始了一个测试项目以成功渲染图像(遵循 this tutorial 的安装和测试项目):

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main (int argc, const char * argv[])
{
    Mat img = imread("/Users/username/path/image.jpg");
    if (img.data == 0) {
        cerr << "Image not found!" << endl;
        return -1;
    }
    namedWindow("image", CV_WINDOW_AUTOSIZE);
    imshow("image", img);
    waitKey();
}

在此之后,我使用了 openCV 库中的示例代码对我的测试项目做了一些更有趣的事情(它应该是一个 facetracker)

#include <opencv2/opencv.hpp>
#include <CoreFoundation/CoreFoundation.h>
#include <cassert>
#include <iostream>

const char  * WINDOW_NAME  = "Face Tracker";
const CFIndex CASCADE_NAME_LEN = 2048;

char  CASCADE_NAME[CASCADE_NAME_LEN] = "/Users/username/path/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml";

using namespace std;

int main (int argc, char * const argv[])
{
    const int scale = 2;

    // locate haar cascade from inside application bundle
    // (this is the mac way to package application resources)
    CFBundleRef mainBundle  = CFBundleGetMainBundle ();
    assert(mainBundle);

    CFURLRef cascade_url = CFBundleCopyResourceURL (mainBundle, CFSTR("haarcascade_frontalface_alt2"), CFSTR("xml"), NULL);
    assert(cascade_url);

    Boolean got_it = CFURLGetFileSystemRepresentation (cascade_url, true, reinterpret_cast<UInt8 *>(CASCADE_NAME),CASCADE_NAME_LEN);
    if (! got_it)
        abort ();

    // create all necessary instances
    cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);
    CvCapture * camera = cvCreateCameraCapture (CV_CAP_ANY);
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad (CASCADE_NAME, 0, 0, 0);
    CvMemStorage* storage = cvCreateMemStorage(0);
    assert (storage);

    // you do own an iSight, don't you ?!?
    if (! camera)
        abort ();

    // did we load the cascade?!?
    if (! cascade)
        abort ();

    // get an initial frame and duplicate it for later work
    IplImage *  current_frame = cvQueryFrame (camera);
    IplImage *  draw_image    = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 3);
    IplImage *  gray_image    = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 1);
    IplImage *  small_image   = cvCreateImage(cvSize (current_frame->width / scale, current_frame->height / scale), IPL_DEPTH_8U, 1);
    assert (current_frame && gray_image && draw_image);

    // as long as there are images ...
    while ((current_frame = cvQueryFrame (camera)))
    {
        // convert to gray and downsize
        cvCvtColor (current_frame, gray_image, CV_BGR2GRAY);
        cvResize (gray_image, small_image, CV_INTER_LINEAR);

        // detect faces
        CvSeq* faces = cvHaarDetectObjects (small_image, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize (30, 30));

        // draw faces
        cvFlip (current_frame, draw_image, 1);
        for (int i = 0; i < (faces ? faces->total : 0); i++)
        {
            CvRect* r = (CvRect*) cvGetSeqElem (faces, i);
            CvPoint center;
            int radius;
            center.x = cvRound((small_image->width - r->width*0.5 - r->x) *scale);
            center.y = cvRound((r->y + r->height*0.5)*scale);
            radius = cvRound((r->width + r->height)*0.25*scale);
            cvCircle (draw_image, center, radius, CV_RGB(0,255,0), 3, 8, 0 );
        }

        // just show the image
        cvShowImage (WINDOW_NAME, draw_image);

        // wait a tenth of a second for keypress and window drawing
        int key = cvWaitKey (100);
        if (key == 'q' || key == 'Q')
            break;
    }

    // be nice and return no error
    return 0;
}

这次有问题,是这个错误:

Ld /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug/OpenCVDemo normal x86_64
    cd /Users/winimac01/Desktop/IOSapp/sviluppo/OpenCVDemo
    setenv MACOSX_DEPLOYMENT_TARGET 10.7
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -L/Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug -F/Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug -filelist /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Intermediates/OpenCVDemo.build/Debug/OpenCVDemo.build/Objects-normal/x86_64/OpenCVDemo.LinkFileList -mmacosx-version-min=10.7 -lopencv_core -lopencv_highgui -lopencv_imgproc -stdlib=libstdc++ -framework CoreFoundation -lopencv_core.2.4.6 -lopencv_highgui.2.4.6 -o /Users/winimac01/Library/Developer/Xcode/DerivedData/OpenCVDemo-cgklqgeatrdcvahjmnlypuyzqich/Build/Products/Debug/OpenCVDemo

Undefined symbols for architecture x86_64:
  "_cvHaarDetectObjects", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有什么想法吗?

edit1:

build设置中的一些信息:

Architectures: 64-bit Intel
Base SDK Latest: OSx (OSX 10.8)
Valid Architectures: i386 x86_64
Other Linker Flags: none
C Language Dialect: GNU99 [-std=gnu99]
C++ Language Dialect: GNU++11 [-std=gnu++11]
C++ Standard Library: libc++ (LLVM C++ standard library with C++)

编辑 2:

一些有趣的东西,通过终端编译

g++ `pkg-config --cflags --libs opencv` main.cpp

我收到此错误:

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
Undefined symbols for architecture x86_64:
  "_CFBundleCopyResourceURL", referenced from:
      _main in cc6OpS79.o
  "_CFBundleGetMainBundle", referenced from:
      _main in cc6OpS79.o
  "_CFURLGetFileSystemRepresentation", referenced from:
      _main in cc6OpS79.o
  "___CFConstantStringClassReference", referenced from:
      CFString in cc6OpS79.o
      CFString in cc6OpS79.o
  "_cvCircle", referenced from:
      _main in cc6OpS79.o
  "_cvCreateCameraCapture", referenced from:
      _main in cc6OpS79.o
  "_cvCreateImage", referenced from:
      _main in cc6OpS79.o
  "_cvCreateMemStorage", referenced from:
      _main in cc6OpS79.o
  "_cvCvtColor", referenced from:
      _main in cc6OpS79.o
  "_cvFlip", referenced from:
      _main in cc6OpS79.o
  "_cvGetSeqElem", referenced from:
      _main in cc6OpS79.o
  "_cvHaarDetectObjects", referenced from:
      _main in cc6OpS79.o
  "_cvLoad", referenced from:
      _main in cc6OpS79.o
  "_cvNamedWindow", referenced from:
      _main in cc6OpS79.o
  "_cvQueryFrame", referenced from:
      _main in cc6OpS79.o
  "_cvResize", referenced from:
      _main in cc6OpS79.o
  "_cvShowImage", referenced from:
      _main in cc6OpS79.o
  "_cvWaitKey", referenced from:
      _main in cc6OpS79.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

最佳答案

我相信这是因为没有链接 objdetect 库。在您提到的教程中,您必须在步骤 vi 中指定它。)以及其他 2 个库。

libopencv_core.2.3.1.dylib
libopencv_highgui.2.3.1.dylib
libopencv_objdetect.2.3.1.dylib

关于c++ - OpenCV,XCode 中的链接错误,体系结构 x86_64 的 undefined symbol : "_cvHaarDetectObjects", 从 : _main in main. o 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735823/

相关文章:

python - 如何在 Python 中使用分水岭算法分离图像

c++ - utf8 等效项显示不正确

c++ - C++串口问题

c++ - 如何将反向迭代器与作为代理的迭代器一起使用

iphone - 有没有办法在 Xcode 4.1 中使用 LLVM 3?

swift - 如何从 userNotificationCenter 中读取内容 - Swift

ios - Xcode 6.3 上的可空性问题

python - 具有非平行外线的立体图像的 OpenCV 深度图

python - 提取检测到的对象并保存到不同的图像 - OpenCV Python

c++ - 父类引用子变量