关于Visual 2005中MFC调用Berkeley DB的编译错误问题
2008年04月28日 星期一 16:15
Berkeley DB如果直接嵌入MFC程序,会因为两个头文件重复定义数据类型而导致编译不能通过,一般错误提示如下:
1>d:/test/include/db.h(1402) : error C2143: syntax error : missing '}' before '(' 1>d:/test/include/db.h(1402) : fatal error C1903: unable to recover from previous error(s); stopping compilation 1>TestDlg.cpp 1>d:/test/include/db.h(1402) : error C2143: syntax error : missing '}' before '(' 1>d:/test/include/db.h(1402) : fatal error C1903: unable to recover from previous error(s); stopping compilation
VC 6中与之冲突定义的文件是oledb.h,一般mfc都要包含stdafx.h文件,因为BerkeleyDb使用的时候编译选项要去掉预编译选项,所以可以把这个文件的包含都去掉,当然若你明确使用OLE的包含文件,可以如下包含:
#define DBTYPE MS_DBTYPE #include <oledb.h> #undef DBTYPE
但是Visual 2005默认两个包含文件中都引入了Dbtype的定义,还在ocdb.h中对DB_UNKNOWN定义,更加麻烦,如果要去掉包含文件,就得注释掉
#include <afxdisp.h>
#include <afxdtctl.h>
两个文件,由于不包含afxdtctl.h文件,AfxEnableControlContainer就也的注释掉,如果这样也就不能使用OLE控件容器
好多网友发信给我,有啥更好的方法,事实上这个问题很简单,就像以前vxwork虚拟机运行上一样,只不过用berkeley db的人很少,很少有这方面的资料,也少有人专研,我琢磨了一下午,给个下面的方案,不影响ole的使用,只不过把ole定义的DBTYPE定义成其他名称
在stdafx.h文件末尾加上这几句就可以
#ifdef DB_UNKNOWN #undef DB_UNKNOWN #endif #define DBTYPE MS_DBTYPE
|