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)
【相关推荐】
首先我新建了一个界面,名为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,就成功了,程序可以正常执行。