为 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 on 2009-10-15 21:45  cy163  阅读(1580)  评论(0编辑  收藏  举报

导航