Qt中使用OR-Tools时重定义(WinSock2.h, winsock.h, ws2def.h)
Redefinition (WinSock2.h, winsock.h, ws2def.h) when using OR-Tools in Qt
我正在使用 Qt for Googles OR-Tools 制作一个 UI,当我尝试构建日志时由于重新定义而变得混乱...
我的 Qt 项目文件的相关部分如下所示
LIBS += or-tools_VisualStudio2017-64bit_v7.0.6546/ortools.lib
INCLUDEPATH += or-tools_VisualStudio2017-64bit_v7.0.6546/include
DEPENDPATH += or-tools_VisualStudio2017-64bit_v7.0.6546/include
编译器抱怨
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(103): warning C4005: "AF_IPX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(457): note: Siehe vorherige Definition von "AF_IPX"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(147): warning C4005: "AF_MAX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(476): note: Siehe vorherige Definition von "AF_MAX"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(185): warning C4005: "SO_DONTLINGER": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(399): note: Siehe vorherige Definition von "SO_DONTLINGER"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(235): error C2011: "sockaddr": "struct" Typneudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(1007): note: Siehe Deklaration von "sockaddr"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(437): error C2059: Syntaxfehler: "Konstante"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(437): error C3805: "Konstante": unerwartetes Token, es wurde entweder "}" oder ein "," erwartet
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(572): warning C4005: "IN_CLASSA": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(284): note: Siehe vorherige Definition von "IN_CLASSA"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(578): warning C4005: "IN_CLASSB": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(290): note: Siehe vorherige Definition von "IN_CLASSB"
and so on ...
我在这样的 class 中使用 OR-Tools
#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;
已经在 SO 和 google 上搜索过并尝试过
#define _WINSOCKAPI_
#define WIN32_LEAN_AND_MEAN
#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;
但这确实有帮助...
非常令人困惑的是,当我在另一个控制台中使用相同的 include only Qt test project it worked...
使用 Notepad++ 的 "search in files" 我发现依赖于 windows.h 的库头是
spinlock_win32.inc
stacktrace_win32-inl.inc
symbolize_win32.inc
waiter.h
CoinTime.hpp
zconf.h
而那些包括 winsock2.h 的是
time.h
time_util.h
但是,我宁愿不更改其中的任何内容,而是希望它像在我的仅控制台测试项目中那样开箱即用...
我正在使用 Qt 5.12.0 MSVC2017 64 位并且在 Win10 上
我能做的不多,这些都是依赖。
据我所知,protobuf 包括 time_util.h 拖拽 winsock2.h
我没有从 cp_model.h
中找到包含 windows.h 的内容
是Qt的吗?
无论如何,你能否将所有 or-tools 代码封装在一个不包含任何可疑内容(如 QT)的 cpp 文件中?
在Qt工程配置文件(*.pro)中添加DEFINES += _WINSOCKAPI_
即可解决
我正在使用 Qt for Googles OR-Tools 制作一个 UI,当我尝试构建日志时由于重新定义而变得混乱...
我的 Qt 项目文件的相关部分如下所示
LIBS += or-tools_VisualStudio2017-64bit_v7.0.6546/ortools.lib
INCLUDEPATH += or-tools_VisualStudio2017-64bit_v7.0.6546/include
DEPENDPATH += or-tools_VisualStudio2017-64bit_v7.0.6546/include
编译器抱怨
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(103): warning C4005: "AF_IPX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(457): note: Siehe vorherige Definition von "AF_IPX"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(147): warning C4005: "AF_MAX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(476): note: Siehe vorherige Definition von "AF_MAX"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(185): warning C4005: "SO_DONTLINGER": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(399): note: Siehe vorherige Definition von "SO_DONTLINGER"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(235): error C2011: "sockaddr": "struct" Typneudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(1007): note: Siehe Deklaration von "sockaddr"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(437): error C2059: Syntaxfehler: "Konstante"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(437): error C3805: "Konstante": unerwartetes Token, es wurde entweder "}" oder ein "," erwartet
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(572): warning C4005: "IN_CLASSA": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(284): note: Siehe vorherige Definition von "IN_CLASSA"
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared\ws2def.h(578): warning C4005: "IN_CLASSB": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um\winsock.h(290): note: Siehe vorherige Definition von "IN_CLASSB"
and so on ...
我在这样的 class 中使用 OR-Tools
#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;
已经在 SO 和 google 上搜索过并尝试过
#define _WINSOCKAPI_
#define WIN32_LEAN_AND_MEAN
#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;
但这确实有帮助...
非常令人困惑的是,当我在另一个控制台中使用相同的 include only Qt test project it worked...
使用 Notepad++ 的 "search in files" 我发现依赖于 windows.h 的库头是
spinlock_win32.inc
stacktrace_win32-inl.inc
symbolize_win32.inc
waiter.h
CoinTime.hpp
zconf.h
而那些包括 winsock2.h 的是
time.h
time_util.h
但是,我宁愿不更改其中的任何内容,而是希望它像在我的仅控制台测试项目中那样开箱即用...
我正在使用 Qt 5.12.0 MSVC2017 64 位并且在 Win10 上
我能做的不多,这些都是依赖。
据我所知,protobuf 包括 time_util.h 拖拽 winsock2.h
我没有从 cp_model.h
中找到包含 windows.h 的内容是Qt的吗?
无论如何,你能否将所有 or-tools 代码封装在一个不包含任何可疑内容(如 QT)的 cpp 文件中?
在Qt工程配置文件(*.pro)中添加DEFINES += _WINSOCKAPI_
即可解决