【Ubuntu系统Qt下使用OpenCV打开摄像头并把图像显示到QLabel上】

error: undefined reference to `cv::VideoCapture::~VideoCapture()’

解决undefined reference to cv::VideoCapture::VideoCapture()
在使用OpenCV进行图像或视频处理时,有时会遇到类似于​​undefined reference to ​​cv::VideoCapture::VideoCapture()`的错误信息。这个错误通常表示找不到相应的函数或类的定义。

问题背景
OpenCV是一个开源的计算机视觉库,提供了许多图像和视频处理相关的函数和类。其中,​​VideoCapture​​是一个用于从摄像头或视频文件中读取帧的类。当我们在编译代码时,如果出现​​undefined reference to ​​cv::VideoCapture::VideoCapture()`的错误信息,就意味着编译器无法找到相应的函数定义。

解决方法
出现​​undefined reference to ​​cv::VideoCapture::VideoCapture()`的错误通常是由于链接器无法找到相应的库文件引起的。要解决这个问题,我们需要确保以下几点:

  1. 检查OpenCV的安装
    首先,我们需要检查OpenCV是否正确安装。可以在终端中运行以下命令来检查OpenCV的版本:
plaintextCopy codepkg-config --modversion opencv

如果OpenCV没有正确安装或版本不匹配,我们需要重新安装或更新OpenCV。

  1. 检查编译命令
    在编译代码时,需要确保正确地指定OpenCV的库文件。对于C++程序,我们需要使用​​-l​​参数来链接OpenCV的库文件。例如,使用以下命令编译一个简单的C++程序:
bashCopy codeg++ -o outputfile program.cpp `pkg-config --libs opencv`

此命令中,​​-o​​参数用于指定输出文件的名称,​​program.cpp​​是待编译的源代码文件,而​​pkg-config --libs opencv​​用于获取OpenCV的库文件名并链接。

  1. 检查库文件路径
    如果以上步骤没有解决问题,我们还需要检查库文件的路径是否正确。可以通过编辑器或IDE中的项目设置来查看库文件的路径配置,确保路径指向正确的OpenCV安装目录。

总结
当编译代码时遇到​​undefined reference to ​​cv::VideoCapture::VideoCapture()​​的错误信息时,我们需要检查OpenCV的安装、编译命令和库文件路径等方面。如果以上步骤都正确,就应该能够解决这个问题并成功编译运行程序。 希望本篇文章对你解决​​undefined reference to ​​cv::VideoCapture::VideoCapture()

但是在交叉编译自己写的程序是总是提示有错误,错误如下:

In file included from main.cpp:3:
./database.h:3:23: QSqlDatabase: No such file or directory
./database.h:4:20: QSqlQuery: No such file or directory
In file included from main.cpp:3:
./database.h: In function `bool createConnection()':
./database.h:8: error: `QSqlDatabase' was not declared in this scope
./database.h:8: error: expected `;' before "db"
./database.h:9: error: `db' was not declared in this scope
./database.h:8: warning: unused variable 'QSqlDatabase'
make: *** [main.o] 错误
提示没有这两个文件或目录?明明在我的include里面怎么会没有?我想尽一切办法,又是该边境变量,又是删除编译文件重新编译,最后还是不行,我一遍一遍的查看include目录,最后发现错误提示的两个文件在include/QtSql/下面所以我就把程序的包含文件目录该了一下原来为:#include,#include改过后为:#include,#include就是在原来的基础上增加一个目录前缀,这样问题就解决了,这个编译通过,但是下面又出现了错误,错误如下:songlist.cpp:6:20: QSqlQuery: No such file or directory
songlist.cpp:12: error: `songlist' has not been declared
songlist.cpp:12: error: ISO C++ forbids declaration of `songlist' with no type
songlist.cpp: In function `int songlist(QWidget*)':
songlist.cpp:12: error: only constructors take base initializers
songlist.cpp:16: error: `ui' was not declared in this scope
songlist.cpp:16: error: invalid use of `this' in non-member function
songlist.cpp:20: error: `model' was not declared in this scope
songlist.cpp:20: error: `QSqlTableModel' has not been declared
songlist.cpp:20: error: invalid use of `this' in non-member function
songlist.cpp:31: error: `model2' was not declared in this scope
songlist.cpp:31: error: `QSqlTableModel' has not been declared
songlist.cpp:31: error: invalid use of `this' in non-member function
songlist.cpp: At global scope:
songlist.cpp:46: error: expected constructor, destructor, or type conversion before '::' token
songlist.cpp:51: error: `songlist' is not a class or namespace
songlist.cpp: In function `void changeEvent(QEvent*)':
songlist.cpp:53: error: cannot call member function `virtual void QWidget::changeEvent(QEvent*)' without object
songlist.cpp:56: error: `ui' was not declared in this scope
songlist.cpp:56: error: invalid use of `this' in non-member function
songlist.cpp:56: warning: unused variable 'ui'
songlist.cpp: At global scope:
songlist.cpp:63: error: `songlist' is not a class or namespace
songlist.cpp: In function `void on_pushButton_clicked()':
songlist.cpp:65: error: `ui' was not declared in this scope
songlist.cpp:70: error: `model' was not declared in this scope
songlist.cpp:80: error: `model2' was not declared in this scope
songlist.cpp:65: warning: unused variable 'ui'
songlist.cpp: At global scope:
songlist.cpp:87: error: `songlist' is not a class or namespace
songlist.cpp: In function `void on_pushButton_4_clicked()':
songlist.cpp:89: error: `ui' was not declared in this scope
songlist.cpp:90: error: `model2' was not declared in this scope
songlist.cpp:92: error: `Dir' was not declared in this scope
songlist.cpp:93: error: `prefix' was not declared in this scope
songlist.cpp:94: error: `PATH' was not declared in this scope
songlist.cpp:97: error: `play1' was not declared in this scope
songlist.cpp:97: warning: unused variable 'play1'
songlist.cpp: At global scope:
songlist.cpp:103: error: `songlist' is not a class or namespace
songlist.cpp: In function `void on_pushButton_3_clicked()':
songlist.cpp:105: error: `ui' was not declared in this scope
songlist.cpp:106: error: `model2' was not declared in this scope
songlist.cpp:105: warning: unused variable 'ui'
songlist.cpp: At global scope:
songlist.cpp:110: error: `songlist' is not a class or namespace
songlist.cpp: In function `void on_pushButton_2_clicked()':
songlist.cpp:115: error: invalid use of `this' in non-member function
database.h: At global scope:
database.h:7: warning: 'bool createConnection()' defined but not used
make: *** [songlist.o] 错误
交叉编译真是让人头大啊!从错误开始的地方找,添加头目录,发现问题还是没有解决,于是就查看songlist.h发现里面什么东西都没了,还提示任何的改动都可能造成文件内容丢失,于是就重新建立了一个工程,继续交叉编译,前面的问题都解决了 ,但是又出现了新的错误,错误如下:main.o: In function `main':
main.cpp:(.text+0x210): undefined reference to `QSqlQuery::~QSqlQuery()'
main.cpp:(.text+0x220): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0x794): undefined reference to `QSqlDatabase::addDatabase(QString const&, QString const&)'
main.cpp:(.text+0x858): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0xbac): undefined reference to `QSqlDatabase::setDatabaseName(QString const&)'
main.cpp:(.text+0xc48): undefined reference to `QSqlDatabase::open()'
main.cpp:(.text+0xcf0): undefined reference to `QSqlQuery::~QSqlQuery()'
main.cpp:(.text+0xd00): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0xd68): undefined reference to `QSqlDatabase::QSqlDatabase()'
main.cpp:(.text+0xd80): undefined reference to `QSqlQuery::QSqlQuery(QString const&, QSqlDatabase)'
main.cpp:(.text+0xd90): undefined reference to `QSqlDatabase::~QSqlDatabase()'
main.cpp:(.text+0xe98): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0xef8): undefined reference to `QSqlDatabase::defaultConnection'
main.cpp:(.text+0xf90): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x1038): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x10e0): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x1188): undefined reference to `QSqlQuery::exec(QString const&)'
main.cpp:(.text+0x1230): undefined reference to `QSqlQuery::exec(QString const&)'
main.o:main.cpp:(.text+0x12d8): more undefined references to `QSqlQuery::exec(QString const&)' follow
songlist.o: In function `songlist::songlist(QWidget*)':
songlist.cpp:(.text+0x1ac): undefined reference to `QSqlQuery::~QSqlQuery()'
songlist.cpp:(.text+0x47c): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0x5b0): undefined reference to `QSqlDatabase::QSqlDatabase()'
songlist.cpp:(.text+0x5d8): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
songlist.cpp:(.text+0x5f4): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0x7c0): undefined reference to `QSqlDatabase::QSqlDatabase()'
songlist.cpp:(.text+0x7e8): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
songlist.cpp:(.text+0x804): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0x8cc): undefined reference to `QSqlQueryModel::query() const'
songlist.cpp:(.text+0x9d0): undefined reference to `QSqlQuery::~QSqlQuery()'
songlist.o: In function `songlist::songlist(QWidget*)':
songlist.cpp:(.text+0xbb8): undefined reference to `QSqlQuery::~QSqlQuery()'
songlist.cpp:(.text+0xe88): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0xfbc): undefined reference to `QSqlDatabase::QSqlDatabase()'
songlist.cpp:(.text+0xfe4): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
songlist.cpp:(.text+0x1000): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0x11cc): undefined reference to `QSqlDatabase::QSqlDatabase()'
songlist.cpp:(.text+0x11f4): undefined reference to `QSqlTableModel::QSqlTableModel(QObject*, QSqlDatabase)'
songlist.cpp:(.text+0x1210): undefined reference to `QSqlDatabase::~QSqlDatabase()'
songlist.cpp:(.text+0x12d8): undefined reference to `QSqlQueryModel::query() const'
songlist.cpp:(.text+0x13dc): undefined reference to `QSqlQuery::~QSqlQuery()'
songlist.o: In function `songlist::on_pushButton_clicked()':
songlist.cpp:(.text+0x2f38): undefined reference to `QSqlTableModel::submitAll()'
songlist.o: In function `songlist::on_pushButton_4_clicked()':
songlist.cpp:(.text+0x43d0): undefined reference to `QSqlTableModel::submitAll()'
songlist.o: In function `songlist::on_pushButton_3_clicked()':
songlist.cpp:(.text+0x47b8): undefined reference to `QSqlTableModel::submitAll()'
collect2: ld returned 1 exit status
make: *** [SKTV] 错误

终于解决了,问题终于解决了。

问题原因:由于交叉编译是使用qte的qmake -project手动建立的工程文件,无法自动判断是否包含数据库,所以我们如果使用了数据库既要手动在工程文件的最后添加一句话,
QT +=sql

error: collect2: error: ld returned 1 exit status

linux下QT编译出现collect2:ld returned 1 exit status错误的原因之一是未安装mesa

sudo apt install libgl1-mesa-dev

1
重启qt

自己遇到的原因是:链接库问题
在.pro文件里:

# opencv
INCLUDEPATH += /usr/local/include \
               /usr/local/include/opencv \
               /usr/local/include/opencv2
LIBS += -L/usr/local/lib/libopencv_*.so

改成:

# opencv
INCLUDEPATH += /usr/local/include \
               /usr/local/include/opencv \
               /usr/local/include/opencv2
LIBS += -L  /usr/local/lib/libopencv_*.so

或:(若使用以上链接库的方式出现undefined undefined reference to xxx的情况,我尝试将opencv的库罗列出来,就编译通过了)

Qt include出现错误

错误提示:/home/user/qttest/doubleimg/camera.cpp:13: error: QCamera: No such file or directory
#include
在pro工程管理文件里改下: QT += multimedia 保存

.pro文件里面加入,再点击保存,就好了
QT += multimedia
QT += multimediawidgets

一、在使用cmake创建项目,并在make过程中,遇到以下问题的,这里提供定位问题并解决的相关参考

问题描述:make过程出现如下报错——

[ 82%] Building CXX object CMakeFiles/dwsr_wholes.dir/src/yolov5.cpp.o
[ 88%] Linking CXX executable dwsr_wholes

常规方法
使用如下代码,在定义头文件的时候加在首尾

#ifndef ***_H
#define ***_H
/*
代码
*/
#endif

如果得不到解决,并且在全局中搜多不到对应函数的多次定义记录,那么可能遇到的问题是多次加载某个定义,使用以下方法
核心原因,多次定义原因在于嵌套定义,新定义的头文件最好不要在头文件里面进行include,同时严格遵照编码准则,方法定义写在cpp里面,不要把方法直接写在头文件里面。

你可能感兴趣的:(ubuntu,qt,opencv,php,linux,开发语言,运维)