前几天写过一篇VC++操作mysql的配置流程的文章,还存在不足,这里进行补充。
因为以前所说的配置在控制台程序(console application)运行没有问题,但想在窗口程序(win32 application或MFC)运行就出问题了。下面就将程序调试的出错信息和解决方法列出:
(1)fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe
这个错误一般新手——像我才会遇到的,原因在于添加c++程序文件中没有加入预编译头文件。有两种解决办法:
一、右键点工程名,选设置,然后选c/c++属性页,再选catagory选单中选 precompiled header ,将选项置成no use 或者autometic。二、在出错的程序文件开头(在其他头文件添加语句之前,否则会影响其他头文件的连入)加入#include “stdafx.h” 。详细了解可以参考网文http://www.cppblog.com/wrhwww/archive/2009/02/20/74374.aspx 。
(2)c:\program files\microsoft visual studio\vc98\include\mysql_com.h(184) : error C2146: syntax error : missing ';' before identifier 'fd'
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(184) : error C2501: 'SOCKET' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(184) : error C2501: 'fd' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(354) : error C2065: 'SOCKET' : undeclared identifier
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(354) : error C2146: syntax error : missing ')' before identifier 's'
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(355) : error C2059: syntax error : ')'
Error executing cl.exe.
win32data.exe - 6 error(s), 0 warning(s)
这个错误相信很多人遇到吧。
根据这个错误提示,查看mysql_com.h 的184行,有my_socket fd;的变量定义语句,根据一般经验可以推断是my_socket 这个变量类型没有定义。
于是溯流而上,查看my_socket的定义,可右键单击->GO to definition of my_socket,如果查找不到就只能手动查找。最后可以在mysql.h中找到这段代码:
#ifndef my_socket_defined
#ifdef __WIN__
#define my_socket SOCKET
#else
typedef int my_socket;
#endif /* __WIN__ */
#endif /* my_socket_defined */
通过解读前后预编译语句,可推出my_socket_defined没有声明而__WIN__已声明,也就是说这里my_socket已经过声明为SOCKET了。
于是再溯流而上,查看SOCKET的定义,类似前面的方法,可以发现在winsock.h的35行有:typedef u_int SOCKET;
而且就在刚才的文件里,即mysql.h的34行处有这样的代码:
#ifdef __LCC__
#include <winsock.h> /* For windows */
#endif
于是可以这样推理:my_socket没有声明 => SOCKET没有声明 => #include <winsock.h>没有运行到 => __LCC__没有声明
于是解决方法就出来了:
一、在包含mysql.h文件的开头(在#include “mysql.h”之前)加入这样的预编译语句:
#ifndef __LCC__
#define __LCC__
#endif
即声明__LCC__使程序能执行到#include <winsock.h> 。
二、直接在mysql_com.h里面加入typedef unsigned int my_socket; ,进行my_socket声明。
不过本人还是偏向于使用第一张方法。
自此解决了问题,win32或MFC程序可以正常使用mysql API操作mysql数据库了。