« »
2009-11-09C/C++

428

Eclipse + CDT + MinGW + MySQL环境搭建解决方案

环境说明: Windows XP, Eclipse 3.5, MinGW 5.1.4, Mysql 5.1.36, CDT 3.1

在Eclipse下用CDT和MinGW编写C访问Mysql时会出现 undefined reference to `mysql_init@4′的问题,这是因为mingw编译时找不到静态库的原因,网上的解决办法一般是用:reimp.exe及dlltool.exe重新生成libmysql.def和libmysql.a,然后用libmysql.a。具体命令是:

dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libmysql.a -k

奇怪的是用这这个办法生成的libmysql.a为0字节,后来查看有libmysql.lib文件,试着将其改名为libmysql.a,问题得到解决,具体解决步骤如下:

1、添加Mysql头文件:
方法1:项目->属性->C/C++ Build->Tool Settings->GCC C Compiler->Directories 中添加你的头文件所在目录,包括Mysql中的include目录。
方法2:将Mysql中的include目录拷到项目下的头文件目录下或MinGW的公共include目录下,目录改名为mysql。

2、添加用于gcc编译的mysql静态库文件
复制mysql安装目录中的\lib\opt\libmysql.lib为libmysql.a。

另外查询或插入记录时乱码问题的解决:
在mysql连接成功后,发出查询之前,加入如下代码

  1. mysql_set_character_set(&mysql,"gb2312");

如有问题,请发邮件到 cdkey51@linuxany.com ,大家一起探讨。


注意:#include winsock.h与#include mysql.h的顺序,如果顺序相反或者未把winsock.h包含进来会出现error: syntax error before “SOCKET”的错误,导入winsock.h和windows.h二者之一便可以解决该问题。

  1. #ifndef MAIN_H_
  2. #define MAIN_H_
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <windows.h>
  8. //#include <winsock.h>
  9. #include <include/mysql.h>
  10.  
  11. #endif /*MAIN_H_*/
  12.  
  13. int main()
  14. {
  15.     MYSQL mysql;
  16.     MYSQL_RES *result;
  17.     MYSQL_ROW row;
  18.    
  19.     mysql_init(&mysql);          // 初始化mysql结构
  20.    
  21.     if (!mysql_real_connect(&mysql, "localhost", "username", "password", "linuxany", 3306, NULL, 0))
  22.     {
  23.         printf("\n数据库连接发生错误!");
  24.     } 
  25.     else
  26.     {
  27.        printf("\n数据库连接成功!\n");
  28.       
  29.        if (mysql_query(&mysql, "select id, name from linuxanyuser"))
  30.        {
  31.            printf("\n数据库查询发生错误");
  32.        }
  33.        else
  34.        {
  35.            mysql_query(&mysql, "select id, name from linuxanyuser");
  36.           
  37.            printf("\n开始查询...");
  38.           
  39.            result = mysql_store_result(&mysql);           // 获得结果集
  40.           
  41.            if (mysql_num_rows(result) != NULL)
  42.            {
  43.                  int numRows = mysql_num_rows(result);         // 获得结果集中的记录数
  44.             int numFields = mysql_num_fields(result);      // 获得表中字段数
  45.            
  46.             printf("\n共 %d 行记录,每行 %d 个字段。", numRows, numFields);
  47.            
  48.             while (row = mysql_fetch_row(result))
  49.             {
  50.                 int i = 0;
  51.                
  52.                 printf("\n 第 %d 行:", i);
  53.                
  54.                 for (i = 0; i < numFields; i++)
  55.                 {
  56.                     fprintf(stdout, " %s", row[i]);     // 打印字段值
  57.                 }
  58.             } 
  59.            }
  60.            else
  61.            {
  62.                printf("\n无查询结果!");
  63.            }
  64.           
  65.            mysql_free_result(result);                    // 释放结果集
  66.        }
  67.     }
  68.    
  69.     mysql_close(&mysql);                                 // 释放数据库连接
  70.  
  71. return 0;
  72. }

您还可能感兴趣的内容

日志信息 »

该日志于2009-11-09 08:42由 admin 发表在C/C++分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »


返回顶部