0、背景
如果需要在QT程序中實(shí)現(xiàn)與MySQL數(shù)據(jù)庫(kù)的交互,那么必不可少的一環(huán)就是對(duì)Qt MySql數(shù)據(jù)庫(kù)驅(qū)動(dòng)的編譯。
1、基本環(huán)境
操作系統(tǒng):Windows10 專業(yè)版 64位
Qt版本:Qt 5.15.2
開發(fā)環(huán)境Qt安裝路徑:D:\Qt
交叉編譯服務(wù)器:Ubuntu 18.4
交叉編譯服務(wù)器Qt安裝路徑:/opt/Qt
目標(biāo)芯片:rk3568
目標(biāo)平臺(tái):arm64
Qt安裝時(shí)需要勾選安裝源碼,否則是無(wú)法找到Qt的數(shù)據(jù)庫(kù)驅(qū)動(dòng)源碼的。
2、開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫(kù)驅(qū)動(dòng)
2.1 依賴說(shuō)明
- mysql.h及相關(guān)頭文件
- libmysql.lib
因?yàn)樵诰幾gQt MySql驅(qū)動(dòng)源碼是需要依賴libmysql.lib和mysql.h頭文件,在開發(fā)環(huán)境中(Windows)我們可以通過(guò)安裝MySql服務(wù)
開發(fā)環(huán)境中MySQL的安裝說(shuō)明:
版本:5.7
安裝目錄:C:\Program Files\MySQL\MySQL Server 5.7
libmysql.lib所在目錄:C:\Program Files\MySQL\MySQL Server 5.7\lib
mysql.h及相關(guān)頭文件所在目錄:C:\Program Files\MySQL\MySQL Server 5.7\include
2.2 MySQL驅(qū)動(dòng)編譯過(guò)程
1、驅(qū)動(dòng)源碼目錄:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql
2、在Windows的開始菜單中找到Qt5.15.2(MinGW 8.1.0 64-bit)命令行工具
3、切換到mysql驅(qū)動(dòng)源碼目錄下:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql,然后分別執(zhí)行以下命令
qmake “INCLUDEPATH+=‘C:\Program Files\MySQL\MySQL Server 5.7\include’” “LIBS+=‘C:\Program Files\MySQL\MySQL Server 5.7\lib\libmysql.lib’” -o Makefile mysql.pro
mingw32-make
qmake "INCLUDEPATH+='C:\Program Files\MySQL\MySQL Server 5.7\include'" "LIBS+='C:\Program Files\MySQL\MySQL Server 5.7\lib\libmysql.lib'" -o Makefile mysql.pro
mingw32-make
4、編譯后的輸出目錄:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers
5、把編譯后的輸出文件libqsqlmysql.a、qsqlmysql.dll、qsqlmysql.dll.debug復(fù)制到D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers目錄下
6、編譯項(xiàng)目需默認(rèn)引用的目錄:D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers
7、要把對(duì)應(yīng)的dll復(fù)制到C:\Windows目錄下:libmysql.dll
3、交叉編譯Qt MySql數(shù)據(jù)庫(kù)驅(qū)動(dòng)
3.1 依賴說(shuō)明
- mysql.h及相關(guān)頭文件
- libmysqlclient.so(注意是目標(biāo)系統(tǒng)的庫(kù)-arm版本的庫(kù))
3.3.1 如何在交叉編譯服務(wù)器上找到mysql.h及相關(guān)頭文件
1、我的交叉編譯服務(wù)器用的就是構(gòu)建目標(biāo)linux操作系統(tǒng)的編譯服務(wù)器(ubuntu18.4),可以通過(guò)安裝libmysqlclient-dev軟件包獲取mysql.h及相關(guān)頭文件。
2、首先切換到root用戶
sudo -i
輸入root用戶的密碼后就切換到root用戶了
3、然后執(zhí)行以下命令(如果未切換到root用戶,則前面加上sudo)
apt-get upgrade
apt-get install -y libmysqlclient-dev
如下圖:
4、安裝完畢后就可以在/usr/include/mysql目錄下找到mysql.h及相關(guān)頭文件了,如下圖:
3.3.2 如果在交叉編譯服務(wù)器上獲得目標(biāo)系統(tǒng)(ARM版本)的libmysqlclient.so庫(kù)
1、在3.3.1中安裝libmysqlclient-dev后,也會(huì)在/usr/lib/x86_64-linux-gnu目錄下部署libmysqlclient.so,但是這個(gè)文件不是arm版本的,因此在交叉編譯qt mysql驅(qū)動(dòng)時(shí),是不能引用這個(gè)庫(kù)的。如下圖:
2、因?yàn)槲业慕徊婢幾g服務(wù)器就是用的構(gòu)建linux操作系統(tǒng)的編譯服務(wù)器,因此在構(gòu)建目標(biāo)操作系統(tǒng)時(shí),可以通過(guò)buildroot的menuconfig勾選mysql的支持以生成arm版本的libmysqlclient.so,如下圖:
3、勾選mysql support后重新構(gòu)建目標(biāo)操作系統(tǒng)后,在buildroot的輸出目錄下的target/usr/lib目錄下就包含arm版本的libmysqlclient.so了,如下圖:
3.2 MySQL驅(qū)動(dòng)交叉編譯過(guò)程
1、我們知道Qt開發(fā)的源碼,要生成可執(zhí)行程序一般要通過(guò)2個(gè)步驟:
- 通過(guò)qmake生成Makefile
- 通過(guò)make對(duì)源碼進(jìn)行編譯生成動(dòng)態(tài)庫(kù)和可執(zhí)行程序
交叉編譯的思路:首先我們要明白在開發(fā)環(huán)境中安裝qt時(shí)自帶的qmake是不能作為交叉編譯用的,因?yàn)樗傻腗akefile中所采用的gcc和g++編譯器都是對(duì)應(yīng)x86和windows的。再就是我們?nèi)绻俳徊婢幾g服務(wù)器(X86/Linux)上直接安裝Linux版本的qt的話,這個(gè)qt自帶的qmake也不能作為交叉編譯用,因?yàn)樗傻腗akefile中所采用的gcc和g++編譯器都是對(duì)應(yīng)x86和Linux的。因此我們首先要找到對(duì)應(yīng)目標(biāo)系統(tǒng)(Arm/Linux)的qmake才行。
2、我是通過(guò)buildroot構(gòu)建目標(biāo)操作系統(tǒng)的,因?yàn)橐谀繕?biāo)系統(tǒng)中運(yùn)行qt的程序,因此在構(gòu)建過(guò)程中要把qt的環(huán)境編譯到目標(biāo)系統(tǒng)中,構(gòu)建完畢后會(huì)在buildroot目錄下生成output目標(biāo),我們可以采用這下面的qmake生成采用交叉編譯器的Makefile,如下:
qmake的目錄為:SDK/buildroot/output/rockchip_rk3568/host/bin/qmake
其中SDK表示編譯目標(biāo)Linux系統(tǒng)的源碼目錄
rockchip_rk3568對(duì)應(yīng)的是芯片型號(hào)
3、我們先把qt源碼部署到交叉編譯環(huán)境中,如下:
4、通過(guò)vim修改mysql.pro工程文件內(nèi)容,注釋掉QMAKE_USE += mysql,如下:
然后按ESC,輸入wq保存退出。
5、然后我們使用SDK/buildroot/output/rockchip_rk3568/host/bin/qmake生成Makefile,同時(shí)要執(zhí)行包含mysql.h及相關(guān)頭文件所在的目錄且依賴的libmysqlclient.so庫(kù)的路徑,如下:
SDK/buildroot/output/rockchip_rk3568/host/bin/qmake “INCLUDEPATH+=/usr/include/mysql” “LIBS+=SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libmysqlclient.so” -o Makefile mysql.pro
其中SDK表示編譯目標(biāo)Linux系統(tǒng)的源碼目錄
rockchip_rk3568對(duì)應(yīng)的是芯片型號(hào)
SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libmyqlclient.so文件是通過(guò)交叉編譯工具對(duì)libmysqlclient-dev源碼編譯生成的針對(duì)目標(biāo)系統(tǒng)(Arm/Linux)的庫(kù)文件。
6、看一下Makfile的內(nèi)容:
可以看到,這里的Makefile中指定的gcc/g++編譯工具就是交叉編譯工具,就是能生成Arm/Linux能運(yùn)行的。
具體目錄為:
SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc
SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-g++
其中SDK表示編譯目標(biāo)Linux系統(tǒng)的源碼目錄
rockchip_rk3568對(duì)應(yīng)的是芯片型號(hào)。
7、這時(shí),再執(zhí)行make就會(huì)采用交叉編譯工具aarch64-buildroot-linux-gnu-gcc和aarch64-buildroot-linux-gnu-g++進(jìn)行編譯了,
編譯完畢后,會(huì)生成libqsqlmysql.so,如下圖:
目錄:QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
其中QtSrc表示Qt的源碼目錄。
至此終于生成了支持目標(biāo)系統(tǒng)(Arm/Linux)能夠識(shí)別的數(shù)據(jù)庫(kù)驅(qū)動(dòng)庫(kù)libqsqlmysql.so。
4、把數(shù)據(jù)庫(kù)驅(qū)動(dòng)部署到目標(biāo)系統(tǒng)中
1、首先通過(guò)MobaXterm以SSH方式連接到目標(biāo)系統(tǒng)(開發(fā)板系統(tǒng))。
2、在/usr/lib/qt/plugins目錄下創(chuàng)建目錄sqldrivers。
3、把在交叉編譯服務(wù)器中生成的QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlmysql.so文件傳到目標(biāo)系統(tǒng)的/usr/lib/qt/plugins/sqldrivers目錄下,如下:
至此,目標(biāo)系統(tǒng)就支持Qt程序?qū)ostgresql數(shù)據(jù)庫(kù)的訪問(wèn)了。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-668532.html
5、QT測(cè)試程序訪問(wèn)MySQL數(shù)據(jù)庫(kù)
5.1 關(guān)鍵代碼
void Widget::on_btnDbTest_clicked()
{
//以下代碼測(cè)試訪問(wèn)MySQL數(shù)據(jù)
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("xxx.xxx.xxx.xxx"); //數(shù)據(jù)庫(kù)服務(wù)器的ip
db.setPort(3306); //數(shù)據(jù)庫(kù)服務(wù)器的端口號(hào)
db.setDatabaseName("mydbname"); //此處寫你數(shù)據(jù)庫(kù)的名稱
db.setUserName("root"); //寫mysql數(shù)據(jù)庫(kù)的用戶名
db.setPassword("root@123"); //寫mysql數(shù)據(jù)庫(kù)的密碼
if (!db.open())
{
qDebug() << "數(shù)據(jù)庫(kù)連接失敗!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "數(shù)據(jù)庫(kù)連接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查詢表格UserInfo成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
5.2 執(zhí)行結(jié)果
把上面的qt程序交叉編譯后放入目標(biāo)系統(tǒng)(arm),執(zhí)行效果如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-668532.html
到了這里,關(guān)于QT學(xué)習(xí)筆記-開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫(kù)驅(qū)動(dòng)與交叉編譯Qt MySql數(shù)據(jù)庫(kù)驅(qū)動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!