OpenCV架构x86_64的未定义符号:错误

时间:2014-07-27 21:12:23

标签: c++ macos opencv osx-mavericks homebrew

在此之前被标记为重复问题请阅读结束。谢谢你的期待。

我使用home-brew设置openCV。

这些是我使用的命令:

brew tap homebrew/science
brew install opencv

我正在使用我在网上找到的以下简单文件来测试我的设置:

// Example showing how to read and write images
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(int argc, char** argv)
{   
    // Load an image from file - change this based on your image name
    Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);

    if(img.empty())
    {
        fprintf(stderr, "failed to load input image\n");
        return -1;
    }

    // this is just to show, that you won't have to pre-alloc
    // result-images with c++ any more..
    Mat gray;
    cvtColor(img,gray,CV_BGR2GRAY);

    // Write the image to a file with a different name,
    // using a different image format -- .png instead of .jpg
    if( ! imwrite("my_image_copy.png", img) )
    {
        fprintf(stderr, "failed to write image file\n");
    }

    // no need to release anything with c++ !   
    return 0;
}

这是我在尝试编译并运行suing g++ test.cpp -o test后得到的错误。

Undefined symbols for architecture x86_64:
  "cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
      _main in test-41a30e.o
  "cv::namedWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.o
  "cv::destroyWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      _main in test-41a30e.o
  "cv::Mat::deallocate()", referenced from:
      cv::Mat::release() in test-41a30e.o
  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.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 test-41a30e.o
  "cv::waitKey(int)", referenced from:
      _main in test-41a30e.o
  "cv::fastFree(void*)", referenced from:
      cv::Mat::~Mat() in test-41a30e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我确实在堆栈溢出时发现了类似的问题,但没有使用自制程序,我不确定时间敏感度(关于OpenCV,我的操作系统等的更新和更改)问题是什么。我使用的是10.9.4操作系统的mac。这些答案对我来说并不是很清楚应该改变什么。许多人只是提出了一行代码而没有说明该行应该去哪里。我对这些技术非常新手。任何帮助都会非常感谢!

编辑: Mark Setchell帮助解决了第一批错误。但我现在得到: g ++ $(pkg-config --cflags --libs opencv)test.cpp -o Test&amp; ./Test

[3] 7187 dyld:未加载库:lib / libopencv_calib3d.2.4.dylib   参考自:/usr/local/Cellar/opencv/2.4.9/include/./Test   原因:找不到图像 [2]完成g ++ $(pkg-config --cflags --libs opencv)test.cpp -o Test 跟踪/ BPT陷阱:5

brewdoctor给了我这个警告: 警告:您的酒窖中有未链接的桶 让桶没有链接可能导致构建问题并导致依赖的酿造 一旦建成,那些桶就无法正常运行。在这些上运行brew link

opencv

所以我运行brew链接--overwrite opencv但得到了这个:

Linking /usr/local/Cellar/opencv/2.4.9... 
Error: Could not symlink include/opencv/cv.h

需要覆盖,因为brew链接opencv给出了

Linking /usr/local/Cellar/opencv/2.4.9... 
Error: Could not symlink include/opencv/cv.h
Target /usr/local/include/opencv/cv.h
already exists. You may want to remove it:
  rm /usr/local/include/opencv/cv.h

3 个答案:

答案 0 :(得分:37)

您收到链接器错误。我认为这是因为您没有链接opencv所需的正确库。

获取正确库的最简单方法是pkg-config,所以我建议:

brew install pkg-config

然后你可能需要重新安装opencv

brew reinstall opencv

或者

brew uninstall opencv
brew install opencv

然后你应该能够做到:

g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test 

你可以运行

pkg-config --cflags --libs opencv4

如果您感兴趣,可以查看它为g++编译器输出的内容 - 它告诉编译器库和头文件的位置。在我的系统上,它输出:

pkg-config --cflags --libs opencv4

-I/usr/local/Cellar/opencv/2.4.12_2/include/opencv \
-I/usr/local/Cellar/opencv/2.4.12_2/include \
-L/usr/local/Cellar/opencv/2.4.12_2/lib \
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

如果您不熟悉pkgconfig,可以要求它告诉您它所知道的所有包裹:

pkg-config --list-all

我的系统提供如下输出:

libzmq                              libzmq - 0MQ c++ library
gio-unix-2.0                        GIO unix specific APIs - unix specific headers for glib I/O library
glibmm-2.4                          glibmm - C++ wrapper for GLib
libpostproc                         libpostproc - FFmpeg postprocessing library
libgsf-1                            libgsf-1 - A library for reading and writing structured files (eg MS OLE and Zip)
gobject-introspection-no-export-1.0 gobject-introspection - GObject Introspection
libtasn1                            libtasn1 - Library for ASN.1 and DER manipulation
libusb-1.0                          libusb-1.0 - C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace
gio-2.0                             GIO - glib I/O library
libusb                              libusb - USB access library (libusb-1.0 compat wrapper)
libecpg_compat                      libecpg_compat - PostgreSQL libecpg_compat library
QtNetwork                           Qtnetwork - Qtnetwork Library
opencv4                              OpenCV - Open Source Computer Vision Library

基本上,上面列表中每行的第一个单词告诉你pkgconfig知道的包的名称,这是你在运行命令时应该指定的名称,如

pkg-config --cflags --libs opencv4

如果您的系统有点乱,您可以找到.pc使用的pkgconfig文件:

find /usr/local/Cellar -name \*.pc

find /usr/local/Cellar -name \*.pc | grep -i opencv

/usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc

然后直接使用配置文件,如下所示:

pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc 

如果一切正确编译,您可以使用

运行它
./test

答案 1 :(得分:9)

您收到这些错误是因为您在代码中使用了未链接到项目的 OpenCV 方法。

到目前为止,您只包括:

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

但是要运行您的代码,您需要的远远超过这两个 OpenCV 库。例如,在尝试在XCODE中构建项目时,我们会出现以下错误:

Undefined symbols for architecture x86_64:
  "cv::imread(cv::String const&, int)", 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)

对应于错误的这一部分:

...  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.o  ...

这是因为XCODE希望在您的代码中执行以下函数:

Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);

但是你实现它的方式,它不知道 imread()是什么,因为缺少对 opencv 库的引用!解决这个特殊问题的图书馆是:

libopencv_imgcodecs.3.1.0.dylib

(当然,版本取决于您使用的 OpenCV 的任何版本。)

要解决此特定错误,您必须执行以下两个步骤:

  1. 将库添加到项目中: 右键单击项目文件。单击“将文件添加到blabla”,然后浏览到您的OpenCV目录。库应位于
  2. /Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib

    小心!这可能取决于您如何安装OpenCV!如果你使用Homebrew安装它。目录应该在这里:

    /usr/local/Cellar/opencv/2.4.9/lib
    

    Picture: Add library to OpenCV Project.

    选择以下库(libopencv_imgcodecs.3.1.0.dylib)并将其添加到您的项目中:

    Picture: Pick the OpenCV Library

    将库添加到项目后,它应显示在左侧列表中。 Double检查您是否选择了正确的库。其中一些名字非常相似!

    1. 在C ++文件中包含库
    2. 正如你所做的那样:

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

      您现在应该继续并包含新的库:

      #include "opencv2/imgcodecs/imgcodecs.hpp"
      

      Picture: Include the new OpenCV Library

      1. 运行程序
      2. 再次构建程序时,应该少一个错误。并且XCODE应该没有问题来运行 cv :: imread

        由于您有很多错误,现在应该继续检查成功构建程序所需的库。

        我建议链接这些库,因为它们很常见:

        #include <iostream>
        #include "opencv2/highgui/highgui.hpp"
        #include "opencv2/imgproc/imgproc.hpp"
        #include "opencv2/core/core.hpp"
        #include "opencv2/video/video.hpp"
        #include "opencv2/imgcodecs/imgcodecs.hpp"
        

        在对所有错误进行疯狂之前,您可以链接所有库并查看它是否正确构建。

答案 2 :(得分:0)

我的问题是brew编译并与Xcode链接,并且我使用的是与Macports不同的g ++版本。我只是将Xcode g ++位置添加到了$PATH文件中的.bash_profile变量中,并用sudo port select --set gcc none取消了错误的g ++二进制文件的链接。您可以通过运行xcodebuild -find g++找到Xcode g ++的位置,我的位置是/Applications/Xcode.app/Contents/Developer/usr/bin/g++