Windows下Qt的MySQL驅動編譯方法及異常錯誤解決方案

2015-11-20

近期,在Windows下使用MinGW編譯Qt的MySQL驅動的過程中,幾經周折,才編譯通過。編譯過程中,遇到了諸多問題。爲了避免後續的驅動編譯不犯類似的錯誤,便於快速完成此驅動編譯,現將編譯方法進行整理。

此方法以本人自己編譯的環境爲案例進行說明。

一、   編譯環境

操作系統:Win7 64位

MySQL服務版本:mysql-5.5.46-win32

Qt版本:4.8.6

編譯環境:MinGW 64位

二、   編譯步驟

(一)         生成libmysql.a文件

由於mingw編譯器連接靜態庫需要使用”.a”後綴的靜態庫文件,但是按照MySQL數據庫後,只有”.lib”格式的靜態庫,因此需要進行轉換。轉換時需要用到兩個工具:reimp.exe和dlltool.exe,這兩個工具的路徑需要再PATH環境變量中配置。轉換命令如下:

首先,打開cmd命令輸入框,進入MySQL安裝路徑下的lib路徑,例如我的路徑爲:” C:\Program Files(x86)\MySQL\MySQL Server 5.5\lib”。

其次,依次輸入下述命令:

reimp -d libmysql.lib

dlltool -k -d libmysql.def -l libmysql.a

執行成功後,即可在此路徑下查看到libmysql.a的庫文件。

(二)         編輯mysql.pro工程文件

在Qt的安裝路徑下找到mysql.pro文件,我的pro文件的路徑爲:”C:\Qt\4.8.6\src\plugins\sqldrivers\mysql\”。

打開mysql.pro文件,在下方添加如下配置:

INCLUDEPATH+="C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/include/"

LIBS+= -L"C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/" –llibmysql

第二行也可以寫成如下方式:

LIBS+= "C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/libmysql.a"

將生成Makefile、Makefile.Debug、Makefile.Release三個Makefile文件及其它文件。如下圖所示:

(三)         編輯Makefile文件

以Debug版本爲例說明。打開Makefile.Debug文件,找到LIBS=”XXXX”行,進行修改。因爲生成的此項配置存在問題。

原始配置如下:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o -llibmysql "-LC:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/" -llibmysql -lQtSqld4 -lQtCored4

根據我們的意圖,按照Makefile的語法規則,可以明顯發現問題所在,首先,”-L”必須放在配置庫的路徑的外部,其次,-llibmysql命令存在重複。

修改後如下:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o -L "C:/Program Files(x86)/MySQL/MySQLServer 5.5/lib/" -llibmysql -lQtSqld4 -lQtCored4

或者修改成如下方式:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o "C:/Program Files(x86)/MySQL/MySQL Server5.5/lib/libmysql.a" -lQtSqld4 -lQtCored4

Release版本的Makefile的修改方式與此相同。

(四)         執行make命令

使用mingw32-make命令執行makefile。若不加參數,則默認執行Makefile.Debug。可以在mingw32-make 命令後寫上debug或release 或者兩者都寫上,即可執行對應版本的Makefile。

例如同時執行debug和release版本的Makefile文件,命令如下:

mingw32-make debug release

執行成功後,即可在debug文件夾下看到qsqlmysqld.a、qsqlmysqld.dll兩個庫文件,在release文件夾下看到qsqlmysql.a、qsqlmysql.dll兩個庫文件。

這四個庫文件,即是編譯成功的debug和release版本的mysql驅動靜態庫和動態庫。

(五)         拷貝驅動文件到指定目錄

將上一步生成的四個驅動文件,拷貝到Qt的數據庫驅動目錄下,即” C:\Qt\4.8.6\plugins\sqldrivers\”路徑下。

(六)         拷貝libmysql.dll文件到指定目錄

將MySQL安裝路徑下的libmysql.dll動態庫文件,拷貝到Qt的bin目錄下,即” C:\Qt\4.8.6\plugins\sqldrivers\”。此時,使用Qt編寫程序連接MySQL數據庫即可連接成功。

三、   測試驅動是否可用

編寫測試Qt驅動的demo程序。主要代碼如下:

#include <QtCore/QCoreApplication>  

#include <QDebug>  

#include <QStringList>  

#include <QString>  

#include <QSqlDatabase>  

int main(int argc, char *argv[])  

{  

    QCoreApplication a(argc, argv);  

    qDebug()<<"Available drivers:";  

    QStringList drivers = QSqlDatabase::drivers();  

    foreach(QString driver,drivers)  

    qDebug()<<"\t"<<driver;  

    return a.exec();  

}  

在工程文件中添加

QT       +=sql

運行此demo程序,即可在可用驅動列表中,看到”QMYSQL3”、” QMYSQL”兩個驅動項目。如下圖所示:


四、   常見問題及解決方案

(一)         Cannot find –llibmysql

找不到“-llibmysql”,原因是Makefile裏面的配置不正確。修改Makefile後,再次編譯,編譯通過。

此問題的解決方案是:請檢查Makefile中的配置,修改使其符合Makefile語法規則後再次嘗試。

(二)         Undefined reference to ‘mysql_character_set_name@4’

出現這種情況,及一系列與mysql相關的未定義的引用時,原因是加載mysql的庫時出現問題。經過網上查詢相關資料,得知是MySQL數據庫的版本問題,使用64位的MySQL數據庫中的鏈接庫時,就會報此錯誤。

解決方案是,安裝32位的MySQL數據庫,配置mysql.pro文件中相關的路徑,再次編譯此驅動,此錯誤就不再出現。

(三)         unrecognized command line option\"-fno-keep-inline-dllexport\"

查詢網上相關資料,出現此錯誤的原因是因爲編譯器的版本較低,查詢當前使用的gcc編譯器的版本,是GCC -4.4.0。網上資料的解釋如下:

this is because\"-fno-keep-inline-dllexport\" is the option of mingw 4.6.1, but i'musing 4.5. So I change it by installingcodelite-3.5.5377-mingw4.6.1-wx2.9.2.exe

翻譯如下:

這是因爲\"-fno-keep-inline-dllexport\"這個選項是mingw4.6.1才具備的功能,當前使用版本太低,因此需要使用4.6.1以上版本的gcc編譯器。

後來安裝了4.8.1版本的gcc編譯器的MinGW編譯環境,編譯此驅動時,上述錯誤消失。

由此可知,此問題的解決方案是安裝4.6.1以上版本的gcc編譯器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章