由于添加了 1 个标头而导致大量错误
Huge amount of errors because of 1 header addition
我开发了一个应用程序(在Visual Studio 2008中),它与MySQL数据库通信并经常使用wxWidgets。问题是当我添加包含文件时,MySQL包含文件存在,我收到大量错误。
这是主文件,我在其中包含 Database.h。
#include <boost/shared_ptr.hpp>
#include <wx/app.h>
#include <ConcreteBatchDialogView.h>
#include <ConcreteLoginDialogView.h>
#include <ConcreteInitDialogView.h>
#include <ConcreteKeyDataView.h>
#include <ConcreteProductDataView.h>
#include <ConcreteView.h>
#include <Controller.h>
#include <DummyModel.h>
#include <Revision.h>
#include <Database.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
...
return 0;
}
Database.h 具有以下代码:
#include <wx/string.h>
#include "DbTable.h"
class DbTable;
class Database
{
public:
Database();
~Database();
....
}
最后,DbTable包含了MySQL:
#include <my_global.h>
#include <mysql.h>
class DbTable
{
public:
// CREATORS
~DbTable();
MYSQL_ROW currentRow;
MYSQL_ROW *row;
}
因此,在我包含 Database.h 之前,应用程序编译良好。
请检查日志:
Compiling...
main.cpp
f:buildmysql5_6_12x32includemy_config.h(263) : warning C4005: 'HAVE_STRNLEN' : macro redefinition
f:buildwxwidgets2_9_1includewxwxcrtbase.h(252) : see previous definition of 'HAVE_STRNLEN'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(460) : see previous definition of 'AF_IPX'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(127) : warning C4005: 'AF_MAX' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(479) : see previous definition of 'AF_MAX'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(402) : see previous definition of 'SO_DONTLINGER'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(485) : see declaration of 'sockaddr'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2143: syntax error : missing '}' before 'constant'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2143: syntax error : missing ';' before 'constant'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2059: syntax error : 'constant'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C2143: syntax error : missing ';' before '}'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(518) : warning C4005: 'IN_CLASSA' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(287) : see previous definition of 'IN_CLASSA'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(524) : warning C4005: 'IN_CLASSB' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(293) : see previous definition of 'IN_CLASSB'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(530) : warning C4005: 'IN_CLASSC' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(299) : see previous definition of 'IN_CLASSC'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(541) : warning C4005: 'INADDR_ANY' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(304) : see previous definition of 'INADDR_ANY'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(543) : warning C4005: 'INADDR_BROADCAST' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(306) : see previous definition of 'INADDR_BROADCAST'
c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(577) : error C2011: 'sockaddr_in' : 'struct' type redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(312) : see declaration of 'sockaddr_in'
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(132) : error C2011: 'fd_set' : 'struct' type redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(68) : see declaration of 'fd_set'
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(167) : warning C4005: 'FD_SET' : macro redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(102) : see previous definition of 'FD_SET'
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(176) : error C2011: 'timeval' : 'struct' type redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(111) : see declaration of 'timeval'
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(232) : error C2011: 'hostent' : 'struct' type redefinition
c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(167) : see declaration of 'hostent'
我认为这已经足够了,但还有更多。
你有什么建议如何处理吗?
我检查了它可能是wxWidgets - MySQL编译的问题。我试图将它们分开,但到目前为止没有帮助。
类定义末尾缺少分号。
与您当前的问题无关,但您应该阅读有关包括警卫的信息。
如果仅仅因为包含头文件而收到很多错误,则应首先检查这两件事。
问题可能来自MySQL头文件,我也包含在一些头文件中。也许wxWidgets和MySQL不喜欢彼此。
实际上我使用的主要内容是MYSQL_ROW,这实际上是
typedef char **MYSQL_ROW.
因此,我决定在所有标题和位置将MYSQL_ROW替换为char **,我使用它并添加标题
#include <my_global.h>
#include <mysql.h>
仅数据库.cpp文件。
有点讨厌的黑客,但有助于解决问题。
你在这里似乎有两个问题:
-
HAVE_STRNLEN
重新定义:wxWidgets 在定义它之前检查它是否尚未定义,因此如果您首先包含 MySQL 标头,这应该可以解决这个问题。 - wxWidgets 包含的 WinSock1 标头与 MySQL 包含的 WinSock2 标头之间的冲突。这可以通过在
wx/setup.h
中启用wxUSE_IPV6
来解决,因为这也会切换到使用 WinSock2 作为副作用。
相关文章:
- C++ 动态数组每次添加时将大小增加 1 - 错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 尝试将 boost::stacktrace 添加到 CMake 项目时出现构建错误
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- 如何添加依赖于类本身的模板成员变量
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 添加符号 libgtest.so 错误:命令行中缺少 DSO
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 由于相同的文件名/类名存在于不同的SO中而导致的SEG错误
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- C#WPF和C++/CLI以及C++在C++/CLI中添加外部库错误
- 添加qt-libs后出现编译错误
- 依赖于模板的错误
- 试图添加两个矢量,但添加顺序错误
- 相当于Windows/MSVC上的段错误?
- 将错误处理添加到加载数据的函数(但有时还需要使用默认值)
- C++错误,添加偶数
- 在流错误上添加空终止符