VS2022中使用QtSql出现LNK2019/LNK1104错误的解决方法
在VS2022中使用Qt VS Tools开发C++项目时QtSql库链接错误的解决方法
问题现象
- 已包含
<QSqlDatabase>、<QSqlError>、<QSqlQuery>等头文件,启动Windows调试器时出现LNK2019未解析外部符号错误。 - 手动添加
Qt5Sql.lib和Qt5Sqld.lib到链接器输入后,又出现LNK1104无法打开文件错误。
错误信息1(LNK2019)
Severity : Error Code : LNK2019 Description : unresolved external symbol "__declspec(dllimport) public: __cdecl QSqlDatabase::QSqlDatabase(void)" (_`_`imp`_`??0QSqlDatabase@@QEAA@XZ) referenced in function "private: void __cdecl LoginPage::onLoginButtonClicked(void)" (?onLoginButtonClicked@LoginPage@@AEAAXXZ) Project : StockManager File : D:\POO-P\StockManager\StockManager\LoginPage.obj Line : 1 Suppression State :
错误信息2(LNK1104)
Code : LNK1104 Description : cannot open file 'Qt5Sqld.lib' Project : StockManager File : D:\POO-P\StockManager\StockManager\LINK Line : 1
相关代码
头文件(LoginPage.h)
#pragma once #include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QVBoxLayout> #include "ui_LoginPage.h" #include <QtSql/QSqlDatabase> #include <QtSql/QSqlError> #include <QtSql/QSqlQuery> class LoginPage : public QWidget { Q_OBJECT public: explicit LoginPage(QWidget* parent = nullptr); QPushButton* getLoginButton() const { return loginButton; } QPushButton* getRegisterButton() const { return registerButton; } bool createConnection(); ~LoginPage(); private slots: void onLoginButtonClicked(); void onRegisterButtonClicked(); signals: void authenticationSuccessful(); private: QPushButton* loginButton; QPushButton* registerButton; QLineEdit* usernameLineEdit; QLineEdit* passwdLineEdit; Ui::LoginPageClass* ui; };
源文件(LoginPage.cpp)
#include "LoginPage.h" LoginPage::LoginPage(QWidget* parent) : QWidget(parent), ui(new Ui::LoginPageClass) { ui->setupUi(this); ui->passwdLineEdit->setEchoMode(QLineEdit::Password); loginButton = ui->loginButton; registerButton = ui->registerButton; createConnection(); connect(ui->loginButton, &QPushButton::clicked, this, &LoginPage::onLoginButtonClicked); connect(ui->registerButton, &QPushButton::clicked, this, &LoginPage::onRegisterButtonClicked); } bool LoginPage::createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName("BOGDAN"); db.setDatabaseName("Driver={SQL Server Native Client 11.0};Server=BOGDAN;Database=StockManager;Trusted_Connection=yes;"); if (!db.open()) { qDebug() << "Connection failed" << db.lastError().text(); return false; } else { qDebug() << "Successfully connected!"; return true; } } void LoginPage::onLoginButtonClicked() { QString username = ui->usernameLineEdit->text(); QString password = ui->passwdLineEdit->text(); QSqlQuery query; query.prepare("SELECT * FROM Users WHERE Username = :username AND Password = :password"); query.bindValue(":username", username); query.bindValue(":password", password); if (query.exec() && query.next()) { emit authenticationSuccessful(); } else { // Invalid login } } void LoginPage::onRegisterButtonClicked() { // ... codul tău aici } LoginPage::~LoginPage() { // nu mai este necesar să ștergi ui manual }
解决方案
1. 用Qt VS Tools自动配置Sql模块
不要手动添加lib文件,Qt VS Tools会自动处理依赖:
- 右键项目 → Qt Project Settings
- 在Qt Modules选项卡中,找到并勾选
sql模块 - 点击确定,VS会自动添加匹配的库文件和路径
2. 对齐项目与Qt的编译模式
- 确认项目的编译模式(Debug/Release)、位数(32/64位)和Qt VS Tools中配置的Qt版本完全一致
- Debug模式下Qt会自动链接带
d后缀的库(如Qt5Sqld.lib),Release模式链接不带d的版本,手动添加会导致模式不匹配
3. 检查Qt安装的Sql组件
- 打开Qt VS Tools的Qt Options,确认已添加的Qt版本路径正确
- 查看
Qt安装目录\5.x.x\msvc2019_64\lib目录,若缺失对应lib文件,说明安装Qt时未勾选Qt SQL组件,重新运行Qt安装程序补装
4. 清理重建项目
- 执行生成 → 清理解决方案
- 再执行生成 → 生成解决方案,清除旧编译缓存的影响
内容的提问来源于stack exchange,提问作者bobodrg
相关产品推荐
相关产品推荐

