本文内容包括两部分:
一。 为 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;
}