为 DEV-C++ 生成 libmysql.a 的过程 及 windows下 devc++ c语言访问mysql数据库 环境配置

本文内容包括两部分:
一。 为 DEV-C++ 生成 libmysql.a 的过程
二。windows下 devc++ c语言访问mysql数据库 环境配置
一。为 DEV-C++ 生成 libmysql.a 的过程
目的:因为DEV-C++ 使用的编译器是gcc, 而 MySQL自带的libmysql.dll 只支持Visual Stdio。为此,需要从libmysql.dll 生成libmysql.a。
使用的命令是:
Dlltool  --input-def   libmySQL.def  --dllname  libmySQL.dll  --output-lib libmySQL.a -k
为使上一命令正确执行,需要注意以下几点:
(1)       dlltoll.exe  存在于 DEV-C++ 目录下(C:\Program Files\DEV-CPP\mingw32\bin);而 libmySQL.def 和 libmySQL.dll 存在于 MySQL目录下。首先需要把libmySQL.def 和 libmySQL.dll 拷贝到dlltoll.exe 所在的目录。而不是相反,把dlltoll.exe 拷贝 到MySQL目录下libmySQL.dll所在的目录。这是 因为libmySQL.dll  的全路径上,有 “MySQL server 5.1”,中间有空格,这会影响 dlltool 命令的执行,产生错误信息
 考虑到 dlltoll.exe 存在于 C:\Program Files\DEV-CPP\mingw32\bin中,因此可以把 libmySQL.dll 拷贝到此目录
“…….installation problem Cannot exec ‘as’”
(2) 上一命令中的libmySQL.def 不是,MySQL安装后即存在的那个文件。而是必须使用下面的命令,基于libmysql.lib 生成。
   Reimp  -d   libmysql.lib (似乎reimp 并不包含在DEV-C的安装包中,需要另外下载)
可以通过比较新生成的 libmySQL.def  和 在另一目录下的 MySQL 自带的同名文件的大小,发现两者是不同的。若错误地使用MySQL 自带的libmySQL.def文件,执行dlltool命令时会出现一系列类似下面的错误信息。
undefined reference to `mysql_real_query@12'
   Reimp包含在 mingw-utils中,因此需要下载  mingw-utils。注:如果在DEV-C中的 Project ---Project Option --- Parameters Linker 中不指定 libmySQL.a 的全路径,也会出现类似
undefined reference to `mysql_init@4' 这样的错误。
(3) 生成libmySQL.a 后,还需要在DEV-C++的 ‘Project Option’ | Compiler Options | Linker Sheet 在linker 一栏添上libmySQL.a 的全路径(含文件名)。
二.  windows下 devc++ c语言访问mysql数据库 环境配置
参考了以下两篇文章
(1) http://hi.baidu.com/leeyou1450/blog/item/78fdd438ec9986f63a87ceaa.html
(2) http://hi.baidu.com/leeyou1450/blog/item/ede27dd8f488bdec39012fa9.html
但是虽然自己也是用的 DEV-C 4.9.9.2版,WindowsXP系统,按照这两篇文章的指示设置却不成功,对其进行了一些改进。具体情况如下。
a) 要想在程序中使用mysql数据库,需要在
  Project |‘Project Option’ | Compiler Options | Linker Sheet 在linker 一栏添上libmySQL.a 的全路径
b) 想在程序中使用多线程,需要在 Project | Project Option’ | Compiler Options | Linker Sheet 在linker 一栏添上
   C:\Program Files\DEV-CPP\Lib\libws2_32.a (据网上文章说 同目录下的文件 libwsock32.a 是旧版,因此应用libws2_32.a)
c) 有网文推荐 在 Project |‘Project Option’ | Compiler Options |的 Copliler 和 C++ Compiler 框中添加
    -Wall 和-W
d) 在 Project |‘Project Option’ | Directories | Include Directories 下添加
   C:\Program Files\MySQL\mysql-5.1.38-win32\include
  这样在 xxx.cpp文件中才可以包含 #include "mysql.h"。
    奇怪的是,在 Tools---Compiler Options---Directories --- C Includes 或 C++ Includes中包含
     C:\Program Files\MySQL\mysql-5.1.38-win32\include
   不起作用
e) Tools---Compiler Options---Directories---Libraries 下添加
    C:\Program Files\MySQL\mysql-5.1.38-win32\lib\opt
可以用下面的代码测试DEV-C的环境设置是否正确
#include <cstdlib>
#include <iostream>
using namespace std;
#include <windows.h>
#include "mysql.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
/*
int main()
{
  WSADATA wsadata;
  WSAStartup(0x101, (LPWSADATA)& wsadata);
  system("PAUSE");
  return 0;
}
*/
int main()
{
       MYSQL mysql;      //mysql连接
       MYSQL_RES *res; //这个结构代表返回行的一个查询结果集
       MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示
       char *query; //查询语句
       int t,r;
       mysql_init(&mysql);
       if (!mysql_real_connect(&mysql,"localhost", "root", "", "mysql",3306,NULL,0))
       {
          printf( "Error connecting to database%s\n",mysql_error(&mysql));
       } else
          printf("Connected...\n");
       query="SET CHARACTER SET GBK"; //设置编码
       t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
       if(t)
       {
            printf("编码设置失败\n");
       }
       query=" select * from user ";
       t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
       if(t)
       {
           printf("执行查询时出现异常: %s",mysql_error(&mysql));
       }else
           printf("[%s] 构建成功 \n",query);
       res=mysql_store_result(&mysql);
       while(row=mysql_fetch_row(res))
       {                          
            for(t=0;t <mysql_num_fields(res);t++)
            {
                printf("%s:   ",row[t]);
            }
            printf("\n");
       }
       mysql_free_result(res);
       //sleep(1);
       scanf("%d",&t);
       return 0;
}
posted @ 2011-02-18 17:48  与时俱进  阅读(3292)  评论(1编辑  收藏  举报
友情链接:同里老宅院民居客栈