操作系统: windows 10 x64
集成开发环境: code blocks 17.12
64位编译器: mingw32-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0版本
mysql连接器: mysql-connector-c-6.1.0-winx64.msi
mysql开发包: mysql++3.2.4
mingw32-make -f Makefile.mingw
开始编译 mysql++libmysqlpp.a
libmysqlpp_excommon.a
libmysqlpp_ssqls2parse.a
mysqlpp.dll
[debug]Thread 1 received signal SIGSEGV, Segmentation fault.
[debug]0x000000006b3c4acc in mysqlpp::DBDriver::connect_prepare (this=0xc036d0) at lib/dbdriver.cpp:107
[debug]D:\work_c++\mysql++-3.2.4\lib\dbdriver.cpp:107:2738:beg:0x6b3c4acc
错误原因: 本地安装的MySQL服务器 是 win-x64-8.0 版本, 而编译 MySQL++ 采用的lib库是5.7 版本. 版本不兼容引起的.
解决办法: 卸载8.0版本 MySQL服务器,重新下载5.7版本的 MySQL服务器安装包 重新安装
[debug]Thread 1 received signal SIGSEGV, Segmentation fault.
[debug]0x00007fff8de481ed in mysql_send_query () from D:\work_c++\rocket\bin\Debug\libmysql.dll
错误原因: 代码本身引起的错误,虽然能编译通过,但是执行的时候会爆段错误,由指针引起的
解决办法: 修正指针引起的段访问错误
// 错误的代码
mysqlpp::Connection conn = new mysqlpp::Connection("test","127.0.0.1","root","root");
mysqlpp::Query query = conn.query("select * from stock");
// 正确代码一
mysqlpp::Connection conn("test","127.0.0.1","root","root");
mysqlpp::Query query = conn.query("select * from stock");
// 正确代码二
mysqlpp::Connection *conn = new mysqlpp::Connection("test","127.0.0.1","root","root");
mysqlpp::Query query = conn->query("select * from stock");
C:\Program Files\MySQL\MySQL Connector C 6.1\include\mysql.h|67|error: 'SOCKET' does not name a type|
C:\Program Files\MySQL\MySQL Connector C 6.1\include\mysql_com.h|320|note: in expansion of macro 'my_socket'|
错误原因: mysql 官方提供的 connector/c 6.1 有很多个版本,
6.1.0
,6.1.1
,6.1.5
,6.1.10
,经过不断验证,在G++编译器中只有 6.1.0 能正常工作, 而且还要修正上面的 SOCKET 类型错误, SOCKET 类型错误,是因为在 windows G++编译环境下 没有引入头文件的缘故
解决办法:在 mysql.h 文件中
#ifdef __LCC__
#include
#endif
如上依葫芦画瓢 增加下面G++编译器条件宏指令,使得windows G++编译环境下,也包含
#ifdef __GNUC__
#include
#endif
codeblock 自带的 mingw 编译环境是 32位的,因此需要从网上下载 64位的 mingw,并重新配置 compiler 和 debugger 选项,如下图所示,否则会引起不必要的麻烦.