libopencv_calib3d:未定义的对'std::__throw_out_of_range_fmt(char const*, ...)的引用@GLIBCXX_3.4.20'

libopencv_calib3d: undefined reference to `std::__throw_out_of_range_fmt(char const*, …)@GLIBCXX_3.4.20'

本文关键字:const 引用 @GLIBCXX char of std 未定义 calib3d throw out fmt      更新时间:2023-10-16

我参考这个在我的Raspberry Pi 2上安装OpenCV(它运行在内核版本4.1.7-v7的最新Raspbian上)。由于依赖错误,我无法安装libgtk2.0-dev,但我能够安装OpenCV而没有任何错误。

我试图交叉编译一些简单的OpenCV代码在Qt为我的树莓派2。但是我在链接器阶段得到以下错误:

/usr/local/lib/libopencv_calib3d.so: undefined reference to
std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20
我的代码是:
myFunc {
    VideoCapture cap(0);
    if (!cap.isOpened()) {
        qDebug() << "Cannot open the video cam";
        return;
    }
    double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
    double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
    qDebug() << "Frame size : " << dWidth << " x " << dHeight;
    namedWindow("MyVideo",CV_WINDOW_AUTOSIZE);
    while (1) {
        Mat frame;
        bool bSuccess = cap.read(frame);
         if (!bSuccess) {
             qDebug() << "Cannot read a frame from video stream";
             break;
         }
         imshow("MyVideo", frame);
         if (/*condition*/) {
            break; 
         }
    }
}

我尝试改变库链接的顺序。但错误仍然存在。我的.pro文件是这样的:

QT       += core gui quick xml widgets
TARGET = myApp
TEMPLATE = app
    QMAKE_CXXFLAGS += -I/mnt/rasp-pi-rootfs/usr/include 
                      -I/mnt/rasp-pi-rootfs/usr/include/libxml2 
                      -I/mnt/rasp-pi-rootfs/usr/include/glib-2.0/glib 
                      -I/mnt/rasp-pi-rootfs/usr/include/glib-2.0 
                      -I/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/glib-2.0 
                      -I/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/glib-2.0/include 
                      -I/mnt/rasp-pi-rootfs/usr/include/gstreamer-1.0 
                      -I/mnt/rasp-pi-rootfs/usr/local/include 
    QMAKE_CXXFLAGS += -Wno-psabi
    QMAKE_LIBDIR_FLAGS += -L/mnt/rasp-pi-rootfs/usr/lib 
                          -L/mnt/rasp-pi-rootfs/lib 
                          -L/mnt/rasp-pi-rootfs/usr/local/lib 
    QMAKE_LFLAGS   += -lgmodule-2.0 
                      -lz 
                      -lxml2 
                      -lgthread-2.0 
                      -lrt 
                      -lglib-2.0 
                      -lpthread 
                      -lgstreamer-1.0 
                      -lgobject-2.0 
                      -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_ts -lopencv_video 
SOURCES += /* all .cpp files */
HEADERS += /* all .h files */

如何解决这个问题?

我设法安装libgtk2.0-dev并再次编译OpenCV。

我也有过同样的经历。我假设你正在使用https://github.com/raspberrypi/tools作为你的工具链,但即使你不是,问题是,无论你使用的工具链,它可能早于gcc/g++ 4.9。

问题是Jessie(即Raspbian 4.1.X)使用gcc/g++ 4.9作为其工具链,而OpenCV正在使用该版本编译器的新STL功能。因此,如果您的应用程序是使用gcc/g++ 4.9之前的工具链构建的,它将无法链接。

解决方案是要么获得至少4.9或更高版本的工具链,要么坚持使用使用gcc 4.6的Raspbian的Wheezy版本。

我在这里的一篇文章中详细介绍了我交叉编译OpenCV应用程序的经验:https://solderspot.wordpress.com/2016/02/04/cross-compiling-for-raspberry-pi-part-ii。

希望这是一些帮助。