• 7793阅读
  • 0回复

[转载]windows下安装qt4及编译mysql5驱动程序全过程 [复制链接]

上一主题 下一主题
离线xxl104
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-01
---来自csdn李荣权的专栏--OS--Soft--Life
http://blog.csdn.net/lhfeng/archive/2007/11/13/1883104.aspx
1.安装dev-cpp
安装到c:\dev-cpp
2.安装mysql,不要安装错了,要下载非安装版的才行,否则会缺少lib等文件夹.这里给出一个下载路径ftp://mirror.mcs.anl.gov/pub/mysql/Downloads/MySQL-5.1/mysql-noinstall-5.1.22-rc-win32.zip
  解压缩并放到c:\mysql文件夹中.为了让mysql把自己的信息写入注册表最好执行一下bin目录下的mysqld.exe文件(鼠标双击即可)
3.安装qt4的开源版
  安装到c:\qt\
  安装过程中会询问mingw的位置指定c:\dev-cpp
4.设置系统变量
  方法是:我的电脑->右键属性->高级->环境变量.如果有些变量已经存在就添加没有就创建出来
  Path=c:\qt\4.3.2\bin;c:\Dev-Cpp\bin;c:\mysql;C:\Qt\4.3.2\include (这个是添加的部分)
  QMAKESPEC=win32-g++(这两个是创建的)
  QTDIR=c:\qt\4.3.2
5.随意编写一个程序测试程序能否编译执行,如果能通过的话继续下面的步骤否则根据错误提示修改相关内容
  例如: qmake -project
            qmake  xx.pro
            make
   在release文件夹中就可以找到可执行文件了.
6.下载动态库格式转换工具,网址为: http://www.qtcn.org/download/mingw-utils-0.3.tar.gz
   把reimp.exe解压缩到C:\Dev-Cpp\bin文件夹下
7.进入mysql文件夹:
    cd c:\mysql\lib\opt
   生成def文件  c:\mysql\lib\opt>reimp -d libmysql.lib
8.进入qt的mysql文件夹
   指定def : C:\mysql\lib\opt>dlltool -k -d libmysql.def -l libmysql.a
  生成makefile文件: (注意下面的命令很长参数也比较多不能写错)
C:\Qt\4.3.2\src\plugins\sqldrivers\mysql.bak>qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE"   "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro
  
9.运行mingw32-make生成mysql的动态库驱动程序文件
  之间可能会出错
  1) D:\Qt\4.3.2\src\plugins\sqldrivers\mysql>mingw32-make
  mingw32-make -f Makefile.Release
  Makefile.Release:104: *** multiple target patterns.  Stop.
  mingw32-make[1]: Entering directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
  mingw32-make[1]: Leaving directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
  mingw32-make: *** [release] Error 2
对于这种错误是生成的makefile文件格式有问题最好把前边的工作从头再来一次,也可以这么修改,但是好像还会有其它错误出现,等待高手指点了.主要原因是由于有些特殊字符无法看到造成的,我是通过notepad2才看出来的.
  2).在编译的过程中可能会出现"mysql.h"文件找不到的提示,修改C:\Qt\4.3.2\src\sql\drivers\mysql文件夹下的qsql_mysql.h文件的第49行,指定mysql.h文件的具体位置,例如 #include <C:\MySQL\include\mysql.h>
  3).  C:\Qt\4.3.2\src\plugins\sqldrivers\mysql>mingw32-make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -shared -Wl,--out-implib,c:\Qt\4.3.2\plugins\sqldrivers\
libqsqlmysql4.a -o "..\..\..\..\plugins\sqldrivers\qsqlmysql4.dll" tmp\obj\relea
se_shared\main.o tmp\obj\release_shared\qsql_mysql.o tmp\obj\release_shared\moc_
qsql_mysql.o  -L"c:\Qt\4.3.2\lib" -L"c:\Qt\4.3.2\lib" tmp\obj\release_shared\qsq
lmysql_resource_res.o C:\MYSQL\LIB\OPT\LIBMYSQL.a -llibmysql -lQtSql4 -lQtCore4
c:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot f
ind -llibmysql
collect2: ld returned 1 exit status
mingw32-make[1]: *** [..\..\..\..\plugins\sqldrivers\qsqlmysql4.dll] Error 1
mingw32-make[1]: Leaving directory `C:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
mingw32-make: *** [release] Error 2
在编译过程中可能会出现"llibmysql文件找不到"的提示拷贝你生成的libmysql.lib文件到C:\Qt\4.3.2\lib文件夹下就可以编译通过了
10.改正以上错误后,编译会通过.你就可以看到mysql的驱动程序了.注意路径和这两个文件的创建日期
11.进入mysql的bin文件夹执行mysqld.exe启动mysql的服务
    C:\>cd mysql\bin                         //进入可执行文件目录
    C:\>cd mysql\bin\mysqld.exe    //启动服务(如果前边启动过了就跳过)
    C:\mysql\bin>mysql.exe -u root //由于还没有给root设置密码所以这里直接登录,有些系统可能会失败
Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 1
Server version: 5.1.22-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> quit                                    //退出客户端
Bye
12.修改root用户的密码
  C:\mysql\bin>mysqladmin.exe -u root -p password "123456"    //修改root密码为 123456
  Enter password:       <---这里一定不要输入东西,直接会车即可
测试空密码能否登录 C:\mysql\bin>mysql.exe -u root                  //这时空密码已经不能登录了
ERROR 1045 (28000): Access denied for user
[email='root'@'localhost']'root'@'localhost'[/email] (using password: NO)
13.登录mysqlo
C:\mysql\bin>mysql.exe -u root -p                     //登录时指定需要输入密码就可以登录了
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.22-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
创建数据库mysql> create database mydata;
Query OK, 1 row affected (0.00 sec)
使用数据库mysql> use mydata;
Database changed
创建表mysql>  CREATE TABLE employee (
    ->      id CHAR(3),
    ->      lastname VARCHAR(30),
    ->      firstname VARCHAR(20),
    ->      dob DATETIME,
    ->      phone VARCHAR(10)
    ->      );
Query OK, 0 rows affected (0.01 sec)
察看表是否创建成功mysql> show tables;
+------------------+
| Tables_in_mydata |
+------------------+
| employee         |
+------------------+
1 row in set (0.00 sec)
插入两条测试数据
mysql>  INSERT INTO employee VALUES ("001", "热", "X", "2000-05-18", "5188");
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO employee VALUES ("002", "包", "子", "2000-05-18", "5198") ;
Query OK, 1 row affected (0.00 sec)
察看数据是走插入成功
mysql> select * from employee;
+------+----------+-----------+---------------------+-------+
| id   | lastname | firstname | dob                 | phone |
+------+----------+-----------+---------------------+-------+
| 001  | 热       | X         | 2000-05-18 00:00:00 | 5188  |
| 002  | 包       | 子        | 2000-05-18 00:00:00 | 5198  |
+------+----------+-----------+---------------------+-------+
2 rows in set (0.00 sec)
mysql> select version();
+----------------------------+
| version()                      |
+----------------------------+
| 5.0.22-community-nt |
+-----------------------------+
1 row in set (0.00 sec)
13.创建应用程序测试数据库是否可以使用
#include<QApplication>
#include<QtSql/QSqlDatabase>
#include<QtSql/QSqlQuery>
#include<QTextEdit>
#include<QtCore/QDateTime>
#include<QtSql/QSqlDriver>
int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  QTextEdit display; display.resize(400, 160);
  display.show(); // 下面进行数据库的设置
  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动
  db.setHostName("localhost");
  db.setDatabaseName("mydata"); // 我们之前建立的数据库
  db.setUserName("root"); // 我们创建的 yunfan 用户名
  db.setPassword("123456"); // yunfan 用户的密码
  bool ok = db.open(); // 尝试连接数据库
  if(ok)
    { // 这里用yunfan已经成功连上数据库
     QSqlQuery query; // 新建一个查询的实例
     if(query.exec("select * from employee")){ // 尝试列出 employee 表的所有记录
     // 本次查询成功
    int numRows = 0; // 询问数据库驱动,是否驱动含有某种特性
    if(db.driver()->hasFeature(QSqlDriver::QuerySize)){
      numRows = query.size(); // 如果支持结果影响的行数,那么直接记录下来
      }
   else
      {
       query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢
       numRows = query.at() + 1;
      }
   QString id, lname, fname, phone; QDateTime dob;
   display.append("===========================================");
   display.append(QString::fromLocal8Bit(" id | 姓名 | 生日 | 电话"));
   display.append("--------------------------------------");
   while(query.next())
      { // 定位结果到下一条记录
       id = query.value(0).toString();
       lname = QString::fromLocal8Bit(query.value(1).toByteArray());
       fname = QString::fromLocal8Bit(query.value(2).toByteArray());
       dob = query.value(3).toDateTime();
       phone = QString::fromLocal8Bit(query.value(4).toByteArray());
       QString result = id + " " + fname + lname + " " + (dob.toString()) + " "+phone;
       display.append(result);
     }
   display.append("============================================");
   display.append(QString("totally %1 rows").arg( numRows) );
   }
  else
      { // 如果查询失败,返回错误
      display.append("From mysql database: Error");
  }
}
else
   { // 打开数据库失败,显示数据库失败
    display.append("cannot open database.");
    display.append("Reason: database error");
}
QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));
return app.exec();
}
qmake -project QT+=sql CONFIG += console
qmake
make

下图为实际运行效果
14.这两个新生成的mysql的驱动程序可以拷贝到其它系统中使用,也就是说一个系统里编译的驱动可以在其它系统中使用,只要拷贝到相应的目录就可以了.至于是否和其它不同版本的mysql能否配合使用没有测试.
快速回复
限100 字节
 
上一个 下一个