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

Posted

技术标签:

【中文标题】Qt 与 OpenCV:LNK2019:未解析的外部符号和未找到文件 mainwindow.obj【英文标题】:Qt with OpenCV: LNK2019:unresolved external symbol and File not Found mainwindow.obj 【发布时间】:2018-01-27 00:36:32 【问题描述】:

我正在尝试构建由Computer-Vision-with-OpenCV-3-and-Qt5 提供的示例qt-opencv 项目Hello_Qt_OpenCV。我将 QtCreator4.5 与 Qt5.7 和 opencv3.2 一起使用。他们的配置与其他一些 qt-opencv 项目配合得很好。

构建项目会带来三个问题:

File not found: mainwindow.obj: LNK2019: unresolved external symbol "void __cdecl cv::medianBlur(class cv::_InputArray const &,class cv::_OutputArray const &,int)" (?medianBlur@cv@@YAXAEBV_InputArray@1@AEBV_OutputArray@1@H@ Z) 在函数“private: void __cdecl MainWindow::on_outputPushButton_pressed(void)”中引用 (?on_outputPushButton_pressed@MainWindow@@AEAAXXZ)

File not found: mainwindow.obj: LNK2019: unresolved external symbol "void __cdecl cv::GaussianBlur(class cv::_InputArray const &,class cv::OutputArray const &,class cv::Size,double,double,int)" (?GaussianBlur@cv@@YAXAEBV_InputArray@1@AEBV_OutputArray@1@V?$Size_@H@1@NNH@Z) 在函数 "private: void __cdecl MainWindow::on_outputPushButton_pressed(void)" (?on_outputPushButton_pressed@MainWindow@ @AEAAXXZ)

LNK1120: 2 unresolved externals release\Hello_Qt_OpenCV.exe:-1: error

我在 (File not found: mainwindow.objcleanrun qmakebuild 尝试了一些建议,但在这种情况下不起作用。

为了您的信息,我发布了 mainwindow.cpp 和 mainwindow.h:

主窗口.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());
 

主窗口.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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你从哪里得到 Open CV for QT 的文件?

以上是关于Qt 与 OpenCV:LNK2019:未解析的外部符号和未找到文件 mainwindow.obj的主要内容,如果未能解决你的问题,请参考以下文章

链接 OpenCV 失败,LNK 2019 未解析的外部符号

opencv/visual studio:错误 LNK2019:未解析的外部符号

错误 LNK2019:未解析的外部符号 opencv

Qt探索之路——Error LNK2019

使用 Qt 和 Cuda for Python 构建 OpenCV,在 build_all cmake 目标上运行到 LNK2019

C++ LNK1120 和 LNK2019 错误:“未解析的外部符号 WinMain@16”