1. 缘起
从mirrors.sohu.com/mysql上下载已编译好的mysql-connector-c++ 1.1.8,按网络上的教程加入到visual c++ 2010的工程,访问MySQL中的数据表时,执行如下代码出错:
boost::scoped_ptr< sql::ResultSet > res (stat->executeQuery("SELECT id, 'mary' FROM test"));
while (res && res->next())
{
cout << " ID:" << res->getInt("id") << endl; //正确
cout << "NAME:" << res->getString(2) << endl; //出错
}
由于没法跟踪到代码级,求助度娘,有某位先行说这是因为debug版本使用了release版本的mysql-connector-C++动态库的问题。那,自己编译吧!
2. 准备:
1)从官网下载boost库 (做个项目之前,我已经下载了boost 1.56,这里略; PS:mysql-connector-C++只用到了boost的头文件,应该可以不编译就可以使用)
2)从http://mirrors.sohu.com/mysql/Connector-C%2b%2b/下载并解压mysql-connector-c++-1.1.8i.zip (源码)
3)从http://mirrors.sohu.com/mysql/Connector-C%2b%2b/下载并解压mysql-connector-c++-noinstall-1.1.8-win32.zip (PS:编译中要用到其config.h等头文件)
4)从http://mirrors.sohu.com/mysql/MySQL-5.5/下载并解压mysql-5.5.55-win32.zip (PS: 编译时要用到其中的mysql-connector-c的静态库mysqlclient.lib以及头文件 )
3. 新建项目
打开VS2010,新建Win32 Library项目“libmysqlconn-c++1.1.8”,删除与托管(.Net)相关的文件和代码
4. 拷贝必要文件 (参考: http://blog.csdn.net/shellching/article/details/8137806, VS2010编译mysql-connector-c++)
1)将mysql-connector-c++源码中的driver文件夹拷贝到项目文件夹中,
2)在项目文件夹中新建include目录,这里需要放两个文件夹:
a)将mysql-connector-c++ noinstall目录中的cppconn文件夹拷贝至include中
b)新建一个mysql文件夹,并将mysql-5.5.55-win32.zip解压之后的include文件夹中的头文件拷贝至其中
3)在项目文件夹中新建lib目录并将mysql-5.5.55-win32.zip解压之后的lib目录中的mysqlclient.lib拷贝至其中
5.添加必要文件到项目
1)将mysql-connector-c++中driver目录下的.h和.cpp文件加入项目(先不加子文件夹nativeapi中的文件):
项目右键->Add->New Filter,命名为“Driver”,“Driver”右键->Add->Existing Item,
找到并选中driver文件夹下的.h和.cpp文件,加入过滤器Driver中
2)再新建Native过滤器,加入driver\native中的cpp文件,注意“libmysql_dynamic_proxy.cpp”和“libmysql_static_proxy.cpp”一定不要添加,否则会出一堆错误“error LNK2005”
6. 设置项目属性
1)C/C++增加“附加包含目录”:
项目文件夹下的include
项目文件夹下的include下的cppconn
项目文件夹下的include下的mysql
boost目录
2)设置预处理器定义:
WIN32;_DEBUG;;CPPCONN_LIB_BUILD
注释:这里编译的是静态库,CPPCONN_LIB_BUILD是静态库的预处理器定义
3)设置链接器
添加“附加包含目录”:项目文件夹下下的lib文件夹
添加“附加依赖项”: mysqlclient.lib
7. 编译
生成libmysqlconn-c++1.1.8.lib
8. 使用
在步骤“0.缘起”中的项目导入libmysqlconn-c++1.1.8.lib,编译,报告如下警告:
LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
无视该警告,运行,正确输出结果!
注释:这或许是因为mysql-connector-c的静态库mysqlclient.lib是release版本,但是使用mysql-5.5.55-win32.zip解压之后的lib/debug目录中的mysqlclient.lib会导致sql::mysql::get_mysql_driver_instance()失败,我没有编译mysql-connector-c,原因尚不清楚,有知道的筒子请告知一下,这里先行谢过!
9. 整理好的vc++2010工程及源代码可以在如下url下载:
http://download.csdn.net/download/hylaking/10141712