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

Bre*_*ren 21 c++ macos homebrew opencv osx-mavericks

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

我用home-brew设置了openCV.

这些是我使用的命令:

brew tap homebrew/science
brew install opencv
Run Code Online (Sandbox Code Playgroud)

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

// 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我在尝试编译和运行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)
Run Code Online (Sandbox Code Playgroud)

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

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

[3] 7187 dyld的:库未加载:/usr/local/Cellar/opencv/2.4.9/include/./Test原因::LIB/libopencv_calib3d.2.4.dylib从引用未找到图像[2]完成克++ $( pkg-config --cflags --libs opencv)test.cpp -o Test Trace/BPT trap:5

brewdoctor给了我这样的警告:警告:取消关联小桶在你的地窖离开小桶断开链接可能导致集结麻烦,导致依赖于那些酒桶酿造到无法正常运行一旦建成.运行brew link这些:

opencv
Run Code Online (Sandbox Code Playgroud)

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

Linking /usr/local/Cellar/opencv/2.4.9... 
Error: Could not symlink include/opencv/cv.h
Run Code Online (Sandbox Code Playgroud)

需要覆盖,因为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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 38

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

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

brew install pkg-config
Run Code Online (Sandbox Code Playgroud)

然后你可能要重新安装opencv

brew reinstall opencv
Run Code Online (Sandbox Code Playgroud)

或者可能

brew uninstall opencv
brew install opencv
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到:

g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test 
Run Code Online (Sandbox Code Playgroud)

你可以跑

pkg-config --cflags --libs opencv4
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

pkg-config --list-all
Run Code Online (Sandbox Code Playgroud)

我的系统提供如下输出:

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
Run Code Online (Sandbox Code Playgroud)

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

pkg-config --cflags --libs opencv4
Run Code Online (Sandbox Code Playgroud)

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

find /usr/local/Cellar -name \*.pc
Run Code Online (Sandbox Code Playgroud)

要么

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

/usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc
Run Code Online (Sandbox Code Playgroud)

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

pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc 
Run Code Online (Sandbox Code Playgroud)

如果它们都正确编译,你可以运行它

./test
Run Code Online (Sandbox Code Playgroud)


Kev*_*zke 11

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

到目前为止,您只包括:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
Run Code Online (Sandbox Code Playgroud)

但是要运行代码,您需要的远远超过这两个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)
Run Code Online (Sandbox Code Playgroud)

这对应于您错误的这一部分:

...  "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  ...
Run Code Online (Sandbox Code Playgroud)

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

Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);
Run Code Online (Sandbox Code Playgroud)

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

libopencv_imgcodecs.3.1.0.dylib

(当然版本取决于您使用的OpenCV版本.)

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

  1. 将库添加到项目中:右键单击项目文件.单击"将文件添加到blabla",然后浏览到您的OpenCV目录.图书馆应位于

/Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib

警告!这可能取决于您如何安装OpenCV!如果您使用Homebrew安装它.目录应该在这里:

/usr/local/Cellar/opencv/2.4.9/lib
Run Code Online (Sandbox Code Playgroud)

图片:将库添加到OpenCV项目.

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

图片:选择OpenCV库

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

  1. 在C++文件中包含库

正如你所做的那样:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
Run Code Online (Sandbox Code Playgroud)

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

#include "opencv2/imgcodecs/imgcodecs.hpp"
Run Code Online (Sandbox Code Playgroud)

图片:包含新的OpenCV库

  1. 运行你的程序

再次构建程序时,应该少一个错误.并且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"
Run Code Online (Sandbox Code Playgroud)

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