在 C++ 中使用库时的“未定义引用”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20450035/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 23:08:57  来源:igfitidea点击:

"Undefined reference to" when using library in C++

c++opencvreferenceundefined

提问by Eric Pasewark

and i was having the following problem when running some code i found on the internet from http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html: newmain.cpp:(.text+0x17): undefined reference to `cv::VideoCapture::VideoCapture()'

在运行我在互联网上从http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html找到的一些代码时,我遇到了以下问题:newmain.cpp:(.text+0x17):对 `cv::VideoCapture::VideoCapture()' 的未定义引用

newmain.cpp:(.text+0x35): undefined reference to `cv::CascadeClassifier::load(std::string const&)'

newmain.cpp:(.text+0x35): 对 `cv::CascadeClassifier::load(std::string const&)' 的未定义引用

newmain.cpp:(.text+0x5f): undefined reference to `cv::CascadeClassifier::load(std::string const&)'

newmain.cpp:(.text+0x5f): 对 `cv::CascadeClassifier::load(std::string const&)' 的未定义引用

newmain.cpp:(.text+0x8e): undefined reference to `cv::VideoCapture::open(int)'

newmain.cpp:(.text+0x8e): 对 `cv::VideoCapture::open(int)' 的未定义引用

newmain.cpp:(.text+0x9d): undefined reference to `cv::VideoCapture::isOpened() const'

newmain.cpp:(.text+0x9d): 对 `cv::VideoCapture::isOpened() const' 的未定义引用

newmain.cpp:(.text+0x116): undefined reference to `cv::waitKey(int)'

newmain.cpp:(.text+0x116): 对 `cv::waitKey(int)' 的未定义引用

newmain.cpp:(.text+0x141): undefined reference to `cv::VideoCapture::read(cv::Mat&)'

newmain.cpp:(.text+0x141): 对 `cv::VideoCapture::read(cv::Mat&)' 的未定义引用

(the list goes on but all the same type of error)

(列表还在继续,但都是相同类型的错误)

The code is supposed to detect faces and eyes from pictures.

该代码应该从图片中检测人脸和眼睛。

The code uses some functions from opencv2, which I have installed:

该代码使用了我已安装的 opencv2 中的一些函数:

    #include "opencv2/objdetect/objdetect.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"

    #include <iostream>
    #include <stdio.h>

    using namespace std;
    using namespace cv;

    /** Function Headers */
    void detectAndDisplay( Mat frame );

    /** Global variables */
    String face_cascade_name = "haarcascade_frontalface_alt.xml";
    String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    String window_name = "Capture - Face detection";

    /** @function main */
    int main( void )
    {
        VideoCapture capture;
        Mat frame;

        //-- 1. Load the cascades
        if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; };
        if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading eyes cascade\n"); return -1; };

        //-- 2. Read the video stream
        capture.open( -1 );
        if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

        while ( capture.read(frame) )
        {
            if( frame.empty() )
            {
                printf(" --(!) No captured frame -- Break!");
                break;
            }

            //-- 3. Apply the classifier to the frame
            detectAndDisplay( frame );

            int c = waitKey(10);
            if( (char)c == 27 ) { break; } // escape
        }
        return 0;
    }

    /** @function detectAndDisplay */
    void detectAndDisplay( Mat frame )
    {
        std::vector<Rect> faces;
        Mat frame_gray;

        cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
        equalizeHist( frame_gray, frame_gray );

        //-- Detect faces
        face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );

        for ( size_t i = 0; i < faces.size(); i++ )
        {
            Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
            ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );

            Mat faceROI = frame_gray( faces[i] );
            std::vector<Rect> eyes;

            //-- In each face, detect eyes
            eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CASCADE_SCALE_IMAGE, Size(30, 30) );

            for ( size_t j = 0; j < eyes.size(); j++ )
            {
                Point eye_center( faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2 );
                int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
                circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
            }
        }
        //-- Show what you got
        imshow( window_name, frame );
    }

Thanks for any help you can give me!

感谢你给与我的帮助!

回答by berak

it seems, you're not linking to any of the opencv libs.

看来,您没有链接到任何 opencv 库。

gcc objDetection.cpp -o objDetection -lopencv_core -lopencv_imgproc -lopencv_objdetect -lopencv_highgui

gcc objDetection.cpp -o objDetection -lopencv_core -lopencv_imgproc -lopencv_objdetect -lopencv_highgui

回答by Marcos C. Santos

As berak said, you need to link the these libraries. To do it at your project on eclipse, you should tell eclipse where find the Includefiles for opencv and Where are the librariesto link.

正如berak所说,您需要链接这些库。要在 eclipse 上的项目中执行此操作,您应该告诉 eclipse 在哪里可以找到opencv的包含文件以及要链接的在哪里。

  1. Go to Project–>Properties
  2. In C/C++ Build, click on Settings. At the right, choose the Tool Settings Tab. Here we will enter the headers and libraries info:
  3. In GCC C++ Compiler, go to Includes. In Include paths(-l)you should include the path of the folder where opencv was installed. By default this place is:
  1. 转到项目–> 属性
  2. C/C++ Build 中,单击 Settings。在右侧,选择工具设置选项卡。在这里,我们将输入标题和库信息:
  3. GCC C++ Compiler 中,转到Includes在包含路径(-l)中,您应该包含安装 opencv 的文件夹的路径。默认情况下,这个地方是:

/usr/local/include/opencv

/usr/local/include/opencv

  1. Now go to GCC C++ Linker
  2. First in Library search path (-L)you have to write the path to where the opencv libraries reside. By default this place is:
  1. 现在转到GCC C++ 链接器
  2. 首先在库搜索路径 (-L) 中,您必须写入 opencv 库所在的路径。默认情况下,这个地方是:

/usr/local/lib

/usr/本地/lib

  1. Then in Libraries(-l)add the OpenCV libraries that you may need. Examples: opencv_core, opencv_imgproc, opencv_highgui... In our case, we want add opencv_videoio(it's a cpp lib).
  2. Done, you're ready to build your project with opencv at eclipse.
  1. 然后在Libraries(-l) 中添加您可能需要的 OpenCV 库。示例:opencv_core、opencv_imgproc、opencv_highgui...在我们的例子中,我们想要添加opencv_videoio(它是一个 cpp 库)。
  2. 完成,您已准备好在 eclipse 中使用 opencv 构建您的项目。

The original tutorial is at Opencv Documentation

原始教程位于Opencv 文档