在 xcode 4.5.1 上链接库 OpenCV 2.4.2

Posted

技术标签:

【中文标题】在 xcode 4.5.1 上链接库 OpenCV 2.4.2【英文标题】:Linking libraries OpenCV 2.4.2 on xcode 4.5.1 【发布时间】:2012-10-07 15:27:11 【问题描述】:

我已经按照此处的说明安装了带有 macports 的 opencv:Compile OpenCV (2.3.1+) for OS X Lion / Mountain Lion with Xcode

我还在 stackexchange 和 google 上搜索并尝试了这个的所有其他变体,但这似乎让我最接近。

它似乎适用于某些事情,但不适用于 2.4.2 附带的示例代码。请注意,我添加了所有 opencv 2.4.2 dylibs Link Binary with Libraries。

例如,以下将编译并运行:

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

int main ( int argc, char **argv )

    cvNamedWindow( "My Window", 1 );
    IplImage *img = cvCreateImage( cvSize( 640, 480 ), IPL_DEPTH_8U, 1 );
    CvFont font;
    double hScale = 1.0;
    double vScale = 1.0;
    int lineWidth = 1;
    cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX | CV_FONT_ITALIC,
           hScale, vScale, 0, lineWidth );
    cvPutText( img, "Hello World!", cvPoint( 200, 400 ), &font,
          cvScalar( 255, 255, 0 ) );
    cvShowImage( "My Window", img );
    cvWaitKey();
    return 0;

但是,当我尝试构建任何示例时,例如 display_image.cpp,示例如下,我得到链接错误。

-不起作用-

 #include <stdio.h>
 #include <iostream>
 #include "opencv2/imgproc/imgproc.hpp"
 #include "opencv2/highgui/highgui.hpp"
 #include "opencv2/flann/miniflann.hpp"

 using namespace cv; // all the new API is put into "cv" namespace. Export its content
 using namespace std;
 using namespace cv::flann;

static void help()

    cout <<
    "\nThis program shows how to use cv::Mat and IplImages converting back and forth.\n"
    "It shows reading of images, converting to planes and merging back, color conversion\n"
    "and also iterating through pixels.\n"
    "Call:\n"
    "./image [image-name Default: lena.jpg]\n" << endl;


int main(int argc, char *argv[])

    help();
    const char* imagename = argc > 1 ? argv[1] : "lena.jpg";
    Mat img = imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function
    if(img.empty())
    
        fprintf(stderr, "Can not load image %s\n", imagename);
        return -1;
    
    if( !img.data ) // check if the image has been loaded properly
        return -1;

    Mat img_yuv;
    cvtColor(img, img_yuv, CV_BGR2YCrCb); // convert image to YUV color space. The output image will be created automatically

    vector<Mat> planes; // Vector is template vector class, similar to STL's vector. It can store matrices too.
    split(img_yuv, planes); // split the image into separate color planes

    imshow("image with grain", img);

    waitKey();

    return 0;



我收到以下错误:

Undefined symbols for architecture x86_64:
 "cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)", referenced from:
  _main in main1.o
 "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
  _main in main1.o
 "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from:
  _main in main1.o
 ld: symbol(s) not found for architecture x86_64
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

知道如何解决这个问题吗?

【问题讨论】:

安东尼和马可在下面给了你正确的答案。它是其中之一,一旦你体验过它,你就会永远知道它。您应该接受答案以帮助未来的访问者。 【参考方案1】:

我遇到了同样的问题。 Xcode 4.5 中的构建设置默认值似乎有所不同。

在“构建设置”下--> Apple LLVM 编译器 4.1 - 语言 >

C++ 标准库:=libc++ (LLVM ...) 更改为 libstdc++ (GNU C++ ...)。

【讨论】:

您能否就答案进行更多开发?我不明白为什么我们必须从 LLVM 更改为 GNU C++。 @glerg 接受答案。 它以完全相反的方式为我工作:我将标准库从 GNU 更改为 LLVM。 @BRabbit27 "nm" 命令显示 libc++ 与 libstdc++ 相比具有不同的符号命名约定。因此,我们必须选择与编译 OpenCV 相同的 C++ 库,否则链接器将无法解析符号。这是一个屏幕截图,显示了 libc++ 和 libstdc++ 之间的不同命名 → link 我正好遇到了这个问题。我的名字修饰不匹配,就像 BRappit27 的屏幕截图所示。但我不明白正在使用的 c++ 库与我的程序的二进制文件如何与 opencv 库链接有什么关系。确定名称修改的不是编译器标志吗?有人可以解释一下吗? 我希望我能接受这个答案。为我节省了几个小时的挫败感。【参考方案2】:

OpenCV 很可能没有使用 C++11 设置编译,而程序是。 在没有 C++11 开关的情况下设置工具的构建(即 -std=c++11 -stdlib=libc++)。

【讨论】:

【参考方案3】:

尝试在 Build Settings->Library search path 中手动添加 port 放置所有 dylib 的目录(/opt/local/lib,如果我没有弄错的话)。这应该可以解决链接问题。

【讨论】:

谢谢,但我已经这样做了。没有它,我会得到一个不同的错误:ld: library not found for -lopencv_calib3d.2.4.2 clang: error: linker command failed with exit code 1 (use -v to see invocation)

以上是关于在 xcode 4.5.1 上链接库 OpenCV 2.4.2的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Xcode 上链接框架/库?

Mac下安装使用OpenCV

Mac下安装使用OpenCV

在 OSX 上链接 OpenGL 框架

C++ Singleton 无法在 Mac OS 上链接

无法在 qt creator 上的 c++ 上链接 realsense 库