在Qt中使用OR-Tools时重新定义(WinSock2.h,winsock.h,ws2def.h)

时间:2019-04-03 13:59:21

标签: qt visual-c++ redefinition or-tools

我正在使用Qt为Google的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\10\include\10.0.17763.0\shared\ws2def.h(103): warning C4005: "AF_IPX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(457): note: Siehe vorherige Definition von "AF_IPX"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(147): warning C4005: "AF_MAX": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(476): note: Siehe vorherige Definition von "AF_MAX"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(185): warning C4005: "SO_DONTLINGER": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(399): note: Siehe vorherige Definition von "SO_DONTLINGER"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(235): error C2011: "sockaddr": "struct" Typneudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(1007): note: Siehe Deklaration von "sockaddr"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(437): error C2059: Syntaxfehler: "Konstante"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(437): error C3805: "Konstante": unerwartetes Token, es wurde entweder "}" oder ein "," erwartet
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(572): warning C4005: "IN_CLASSA": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(284): note: Siehe vorherige Definition von "IN_CLASSA"
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\ws2def.h(578): warning C4005: "IN_CLASSB": Makro-Neudefinition
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\winsock.h(290): note: Siehe vorherige Definition von "IN_CLASSB"
and so on ...

我正在此类中使用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时,只有Qt测试项目才起作用...

使用Notepad ++的“搜索文件”,我发现了依赖于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上运行

2 个答案:

答案 0 :(得分:0)

我无能为力,这些都是依赖项。

据我所知,protobuf包含time_util.h,它拖曳winsock2.h

我从cp_model.h中找不到包含Windows .h的内容

是Qt吗?

无论如何,您可以将所有不包含任何可疑内容(例如QT)的or-tools代码封装在cpp文件中吗?

答案 1 :(得分:0)

在Qt项目配置文件(* .pro)中添加DEFINES += _WINSOCKAPI_已解决。