我提到了 this在我的 Raspberry Pi 2 上安装 OpenCV(它运行在最新的 Raspbian 上,内核版本为 4.1.7-v7)。由于依赖项错误,我无法安装 libgtk2.0-dev,但我能够毫无错误地安装 OpenCV。
我正尝试在 Qt 中为我的 Raspberry Pi 2 交叉编译一些简单的 OpenCV 代码。但是我在链接器阶段遇到以下错误:
/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 或更高版本的工具链,要么坚持使用 Raspbian 的 Wheezy 版本,它使用 gcc 4.6。
我在此处的帖子中详细介绍了交叉编译 OpenCV 应用程序的经验:https://solderspot.wordpress.com/2016/02/04/cross-compiling-for-raspberry-pi-part-ii .
希望对您有所帮助。
关于opencv - libopencv_calib3d : undefined reference to `std::__throw_out_of_range_fmt(char const*, …)@GLIBCXX_3.4.20' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33239805/