Qt LNK2019报错

QT 在包含头文件的情况下,在其他的类中调用以下类的任何函数都会报错 LNK2019无论是实例化还是非实例化都一样,包括删除build重新执行qmake以及重构都试过了。
以下是类内具体实现。



```c++
#include "link2db.h"


LInk2DB::LInk2DB()
{

}
void LInk2DB::Link_to_DB(int Linkstatus){
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setHostName("127.0.0.1");//目前为本地连接LocalHost
    db.setPort(3306);
    db.setDatabaseName("test");
    db.setUserName("root");
    db.setPassword("1q2q3wer,./");
    db.open();
    qDebug()<<db.open();

}

int Selectaccount(QString account){
    QSqlQuery query;
    query.prepare("SELECT Id FROM users WHERE account = ?");//此处存在问题
    query.addBindValue(account);
    query.exec();
    QString realAccount;
    int status=0;
    while(query.next()){
        realAccount=query.value(0).toString();
    }
    if(realAccount.isEmpty()){
        status =-1;
        return status;
    }
    else{
        status =1;
        return status;
    }
}
QString SelectMD5(QString account0){
    QSqlQuery query;
    query.prepare("SELECT pwd FROM users WHERE account= ?");
    query.addBindValue(account0);
    query.exec();
    QString realMD5;
    while(query.next()){
        realMD5 = query.value(0).toString();
    }
    return realMD5;
}
QString SelectSalt(QString account0){
    QSqlQuery query;
    query.prepare("SELECT salt FROM users WHERE account= ?");
    query.addBindValue(account0);
    query.exec();
    QString salt;
    while(query.next()){
        salt = query.value(0).toString();
    }
    return salt;
}
int InsertToDB(QString name,QString account,QString salt,QString MD5){
    QSqlQuery query("SELECT Id FROM users ORDER BY Id DESC LIMIT 1");
    int Idnum =0;
    while (query.next()) {
        Idnum = query.value(0).toInt();
    }
    int count=Idnum+1;
    QSqlQuery query1;
    query1.prepare("insert into users(Id,name,account,salt,pwd) values(?,'?','?','?','?')");
    query1.addBindValue(count);
    query1.addBindValue(name);
    query1.addBindValue(account);
    query1.addBindValue(salt);
    query1.addBindValue(MD5);
    query1.exec();
    return 0;
}
LInk2DB::~LInk2DB(){

}


以下是头文件

#ifndef LINK2DB_H
#define LINK2DB_H
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QDebug>


class LInk2DB
{
public:
    LInk2DB();
    void Link_to_DB(int status);
    int Selectaccount(QString account);
    QString SelectMD5(QString account0);
    QString SelectSalt(QString account0);
    int InsertToDB(QString name,QString account,QString salt,QString MD5);

    ~LInk2DB();
};

#endif // LINK2DB_H

类的成员函数在cpp中定义时前面要加上类名,返回类型 类名::函数名,所以你cpp的代码:

int Selectaccount(QString account)
QString SelectMD5(QString account0)
QString SelectSalt(QString account0)
int InsertToDB(QString name,QString account,QString salt,QString MD5)

应该改为:

int LInk2DB::Selectaccount(QString account)
QString  LInk2DB::SelectMD5(QString account0)
QString  LInk2DB::SelectSalt(QString account0)
int  LInk2DB::InsertToDB(QString name,QString account,QString salt,QString MD5)

【相关推荐】



  • 你可以看下这个问题的回答https://ask.csdn.net/questions/1063771
  • 这篇博客你也可以参考下:Qt 在VS下使用添加新类后报错LNK2019无法解析的外部符号解决办法
  • 您还可以看一下 陈超老师的Qt音视频开发实战课程中的 Qt复杂控件自定义2 播放状态以及结束重置小节, 巩固相关知识点
  • 除此之外, 这篇博客: Qt 错误: LNK2019: 无法解析的外部符号 原因及解决办法中的 错误原因2:添加新的.ui窗体文件时编译器没有为它生成新的.obj文件而报错,需要重新执行qmake,而不是重新构建项目 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    首先我新建了一个界面,名为p1553B2,之后在automatic.h文件中,我include p1553B2的头文件,并且为界面类p1553B2声明了一个对象P1553B_2

    #ifndef AUTOMATIC_H
    #define AUTOMATIC_H
    
    #include <QWidget>
    #include <QtGui>
    #include <QtWidgets>
    #include "P1553B2.h"  // 包含新窗体的头文件
    
    namespace Ui {
    class Automatic;
    }
    
    class Automatic : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Automatic(QWidget *parent = 0);
        ~Automatic();
    
    private slots:
        void on_P1553B2_clicked();
        
    private:
        Ui::Automatic *ui;
        p1553B2 P1553B_2;  // 为新窗体声明一个对象
    };
    
    #endif // AUTOMATIC_H
    

    之后,我在automatic.c中的一个button的响应函数中调用P1553B_2.show();让这个界面显示

    void Automatic::on_P1553B2_clicked()
    {
        P1553B_2.show();
    }
    

    编译的结果是错误,无法解析的外部符号
    在这里插入图片描述
    之后,我选择 构建->执行qmake,执行成功后再选择构建->构建项目Automatic3,就成功了,程序可以正常执行。
    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^