带OpenCV的Qt:LNK2019:未解析的外部符号和文件找不到mainwindow.obj

带OpenCV的Qt:LNK2019:未解析的外部符号和文件找不到mainwindow.obj,qt,opencv,Qt,Opencv,我正在尝试构建一个示例qt opencv项目Hello\u qt\u opencv,该项目由提供。我将QtCreator4.5与Qt5.7和opencv3.2一起使用。它们的配置与其他一些qt-opencv项目配合得很好 建设该项目有三个问题: 找不到文件:mainwindow.obj:LNK2019:未解析的外部符号“void\uu cdecl cv::medianBlur(类cv:_inputarrayconst&,类cv:_outputarrayconst&,int)”(?medianBl

我正在尝试构建一个示例qt opencv项目
Hello\u qt\u opencv
,该项目由提供。我将QtCreator4.5与Qt5.7和opencv3.2一起使用。它们的配置与其他一些qt-opencv项目配合得很好

建设该项目有三个问题:

找不到文件:mainwindow.obj:LNK2019:未解析的外部符号
“void\uu cdecl cv::medianBlur(类cv:_inputarrayconst&,类cv:_outputarrayconst&,int)”(?medianBlur@cv@@雅克萨韦布_InputArray@1@AEBV_OutputArray@1@H@Z)在函数“private:void\u cdecl主窗口::on\u outputPutton\u按下(void)”中引用(?on_输出按钮_pressed@MainWindow@@AEAAXXZ)

找不到文件:mainwindow.obj:LNK2019:未解析的外部符号
“void\uuuu cdecl cv::GaussianBlur(类cv:u InputArray const&,类cv::OutputArray const&,类cv::Size,double,double,int)”(?GaussianBlur@cv@@雅克萨韦布_InputArray@1@AEBV_OutputArray@1@V?$Size_@H@1@NNH@Z)在函数中引用“专用:无效cdecl主窗口::打开输出按钮按下(无效)”(?打开输出按钮_pressed@MainWindow@@AEAAXXZ)

我在(通过
clean
runqmake
build
尝试了一些建议,但是在这种情况下这些建议不起作用

为供参考,我发布mainwindow.cpp和mainwindow.h:

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    loadSettings();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_inputPushButton_pressed()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open Input Image", QDir::currentPath(), "Images (*.jpg *.png *.bmp)");
    if(QFile::exists(fileName))
    {
        ui->inputLineEdit->setText(fileName);
    }
}

void MainWindow::on_outputPushButton_pressed()
{
    QString fileName = QFileDialog::getSaveFileName(this, "Select Output Image", QDir::currentPath(), "*.jpg;;*.png;;*.bmp");
    if(!fileName.isEmpty())
    {
        ui->outputLineEdit->setText(fileName);
        using namespace cv;
        Mat inpImg, outImg;
        inpImg = imread(ui->inputLineEdit->text().toStdString());
        if(ui->medianBlurRadioButton->isChecked())
            cv::medianBlur(inpImg, outImg, 5);
        else if(ui->gaussianBlurRadioButton->isChecked())
            cv::GaussianBlur(inpImg, outImg, Size(5, 5), 1.25);
        imwrite(fileName.toStdString(), outImg);
        if(ui->displayImageCheckBox->isChecked())
            imshow("Output Image", outImg);
    }
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    int result = QMessageBox::warning(this, "Exit", "Are you sure you want to close this program?", QMessageBox::Yes, QMessageBox::No);
    if(result == QMessageBox::Yes)
    {
        saveSettings();
        event->accept();
    }
    else
    {
        event->ignore();
    }
}

void MainWindow::loadSettings()
{
    QSettings settings("Packt", "Hello_OpenCV_Qt", this);
    ui->inputLineEdit->setText(settings.value("inputLineEdit", "").toString());
    ui->outputLineEdit->setText(settings.value("outputLineEdit", "").toString());
    ui->medianBlurRadioButton->setChecked(settings.value("medianBlurRadioButton", true).toBool());
    ui->gaussianBlurRadioButton->setChecked(settings.value("gaussianBlurRadioButton", false).toBool());
    ui->displayImageCheckBox->setChecked(settings.value("displayImageCheckBox", false).toBool());
}

void MainWindow::saveSettings()
{
    QSettings settings("Packt", "Hello_OpenCV_Qt", this);
    settings.setValue("inputLineEdit", ui->inputLineEdit->text());
    settings.setValue("outputLineEdit", ui->outputLineEdit->text());
    settings.setValue("medianBlurRadioButton", ui->medianBlurRadioButton->isChecked());
    settings.setValue("gaussianBlurRadioButton", ui->gaussianBlurRadioButton->isChecked());
    settings.setValue("displayImageCheckBox", ui->displayImageCheckBox->isChecked());
} 
mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QDir>
#include <QFile>
#include <QCloseEvent>
#include <QMessageBox>
#include <QSettings>
#include "opencv2/opencv.hpp"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);

private slots:
    void on_inputPushButton_pressed();

    void on_outputPushButton_pressed();

private:
    Ui::MainWindow *ui;

    void loadSettings();
    void saveSettings();

};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“opencv2/opencv.hpp”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
受保护的:
无效关闭事件(QCloseEvent*事件);
专用插槽:
按下按钮时无效();
按下按钮按钮时无效();
私人:
Ui::MainWindow*Ui;
void loadSettings();
void saveSettings();
};
#endif//main窗口

您还可以下载项目文件并快速运行,以查看问题是否与项目本身有关。

.pro
文件中添加
imgproc320
,然后问题就解决了

您从哪里获得了Open CV for QT的文件?
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QDir>
#include <QFile>
#include <QCloseEvent>
#include <QMessageBox>
#include <QSettings>
#include "opencv2/opencv.hpp"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);

private slots:
    void on_inputPushButton_pressed();

    void on_outputPushButton_pressed();

private:
    Ui::MainWindow *ui;

    void loadSettings();
    void saveSettings();

};

#endif // MAINWINDOW_H