C++连接MySql数据库问题

C++连接MySql数据库问题,第1张

#include <iostream>

#include <winsock2.h> // mysql.h中需要

#include <mysql/mysql.h>// 确保加了mysql的头文件到编译器目录里/**

* 我只演示了连接,执行语句等请搜索网上例子

* 项目需要连接 libmysql.lib

* 执行程序需要包含 libmySQL.dll

*/

int main()

{

MYSQL * temp = NULL

MYSQL * temp2 = NULL

my_bool my_true = true const char* hostname = "localhost"//数据库地址

const char* usernmae = "root" //用户名

const char* password = "root" //密码

const char* dbName = "test" //数据库名

unsigned int port= 3306 //端口temp = mysql_init( NULL )

if(!temp)

{

printf("初始化失败")

return 0

}if(mysql_options(temp, MYSQL_SET_CHARSET_NAME, "gbk"))

{

printf("设置charset失败")

return 0

}if(mysql_options(temp, MYSQL_OPT_RECONNECT, &my_true))

{

printf("设置可重连失败")

return 0

}temp2 = mysql_real_connect(temp, hostname, usernmae, password, dbName, port, NULL, 0)

if(!temp2)

{

printf("连接失败")

mysql_close(temp)

return 0

}printf("连接成功,`temp2` 即为mysql连接,用做后续的查询等 *** 作.") return 0

}

下载了boost包之后,运行其根目录下的bootstrap.bat生成bjam.exe文件,bjam.exe是生成boost库的.lib文件的工具

然后在命令行输入

bjam stage --toolset=msvc-10.0 --stagedir="D:/U3D Demo/AsioTestServer/boost_1_45_0" link=shared runtime-link=shared threading=multi debug release

bjam stage --toolset=msvc-10.0 --stagedir="D:/U3D Demo/AsioTestServer/boost_1_45_0" link=static runtime-link=static threading=multi debug release

上一句是生成动态库,下一句是生成静态库

编译时间比较长,编译完成以后,目录中会多一个lib目录,里面就是库文件了

回到VS2010一编译,报错之!错误 1 error LNK1104: 无法打开文件“libboost_system-vc100-mt-gd-1_45.lib” ......

查找之,使用boost库不需要在工程设置中显式的指定库名字,而是由boost自身来完成这个设定的。由于boost库跨平台并且支持多个编译环境,因此这个被链接库文件的文件名是根据当前编译的配置动态生成的。boost_system是库的基本名称,vc100是编译环境,mt表示这是一个多线程库,gd表示包含调试信息,最后的1_45是版本号。检查lib目录的库文件,发现有boost_system-vc100-mt-gd-1_45.lib,所以很明显,在库名生成的过程中出现了问题,多了一个“lib”前缀。

打开boost/regex.hpp,继续打开boost/regex/config.hpp文件,最终可以发现动态链接配置的功能是由boost/config/auto_link.hpp统一实现的。在这个文件开头的注释里详细说明了使用方式。这里提到了名称的构造公式:

BOOST_LIB_PREFIX

+ BOOST_LIB_NAME

+ "_"

+ BOOST_LIB_TOOLSET

+ BOOST_LIB_THREAD_OPT

+ BOOST_LIB_RT_OPT

"-"

+ BOOST_LIB_VERSION

根据我们的错误,我们应该检查BOOST_LIB_PREFIX的值为什么是“lib”而不是空的。通过搜索,发现

[cpp] view plaincopyprint?

#if (defined(_DLL) || defined(_RTLDLL)) &&defined(BOOST_DYN_LINK)

# define BOOST_LIB_PREFIX

#elif defined(BOOST_DYN_LINK)

# error "Mixing a dll boost library with a static runtime is a really bad idea..."

#else

# define BOOST_LIB_PREFIX "lib"

#endif

[cpp] view plaincopyprint?

#if (defined(_DLL) || defined(_RTLDLL)) &&defined(BOOST_DYN_LINK)

# define BOOST_LIB_PREFIX

#elif defined(BOOST_DYN_LINK)

# error "Mixing a dll boost library with a static runtime is a really bad idea..."

#else

# define BOOST_LIB_PREFIX "lib"

#endif

现在终于清楚了,我们应该在工程设置中加入_DLL定义或者_RTLDLL定义,并且指定boost库采用动态连接(定义BOOST_DYN_LINK)。

在工程设置中加入_DLLBOOST_DYN_LINK,链接通过。 但又报另一个库链接错误,错误原因相同,查看auto_link.hpp文件末尾,发现

#if defined(BOOST_DYN_LINK)

# undef BOOST_DYN_LINK

#endif

这样,刚定义的BOOST_DYN_LINK在用过一次之后就失效了,所以注释这一段,之后编译就没问题了。分析要么在工程中添加BOOST_DYN_LINK,然后注释undef这段代码,要么把BOOST_DYN_LINK定义在auto_link.hpp的开头。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9952428.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存