libopencv_calib3d: riferimento non definito a `std :: __ throw_out_of_range_fmt (char const *, …) @ GLIBCXX_3.4.20 ‘

Ho fatto riferimento a questo per installare OpenCV sul mio Raspberry Pi 2 (che è in esecuzione sull’ultima versione di Raspbian con la versione 4.1.7-v7 del kernel). Non ero in grado di installare libgtk2.0-dev a causa di errori di dipendenza, ma ero in grado di installare OpenCV senza errori.

Sto cercando di compilare un semplice codice OpenCV in Qt per il mio Raspberry Pi 2. Ma sto ricevendo il seguente errore nella fase di linker:

/usr/local/lib/libopencv_calib3d.so: undefined reference to std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20 

Il mio codice è:

 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; } } } 

Ho provato a cambiare l’ordine in cui le librerie sono collegate. Ma l’errore rimane ancora. Il mio file .pro questo aspetto:

 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 */ 

Come posso risolvere questo?

AGGIORNARE

Sono riuscito a installare libgtk2.0-dev e compilare di nuovo OpenCV. Ma l’errore rimane.

Ho avuto la stessa esperienza. Presumo che tu stia utilizzando https://github.com/raspberrypi/tools come tua toolchain, ma anche se non sei il problema è che qualunque toolchain che stai usando probabilmente è precedente a gcc / g ++ 4.9.

Il problema è che Jessie (cioè Raspbian 4.1.X) usa gcc / g ++ 4.9 come sua toolchain e OpenCV sta facendo uso di una funzione STL che è nuova a quella versione del compilatore. Pertanto, se la tua applicazione è costruita con una toolchain che precede gcc / g ++ 4.9, non collegherà.

La soluzione è quella di ottenere una toolchain di almeno 4,9 o superiore o attenersi alla versione Wheezy di Raspbian, che utilizza gcc 4.6.

Ho dettagliato la mia esperienza con la compilazione incrociata di un’app OpenCV in un post qui: https://solderspot.wordpress.com/2016/02/04/cross-compiling-for-raspberry-pi-part-ii .

Spero che sia di qualche aiuto.