Search code examples
qtvisual-c++redefinitionor-tools

Redefinition (WinSock2.h, winsock.h, ws2def.h) when using OR-Tools in Qt


I am making an UI with Qt for Googles OR-Tools and when trying to build logs go haywire with redefinitions...

The relevant part of my Qt project file looks like this

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

The compiler complains about

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 ...

I am using OR-Tools in a class like this

#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;

Already searched here on SO and on google and have tried

#define _WINSOCKAPI_
#define WIN32_LEAN_AND_MEAN
#include "ortools/sat/cp_model.h"
using namespace operations_research;
using namespace operations_research::sat;

But that doenst help...

What is very confusing is that when i used that same include in another console only Qt test project it worked...

With Notepad++'s "search in files" i found out the library headers that depend on windows.h are

spinlock_win32.inc
stacktrace_win32-inl.inc
symbolize_win32.inc
waiter.h
CoinTime.hpp
zconf.h

And those that include winsock2.h are

time.h
time_util.h

However, I'd rather not chage anything in them and like to have it work out-of-the-box like it did with my console only test project...

Im am using Qt 5.12.0 MSVC2017 64 Bit and am on Win10


Solution

  • Adding a DEFINES += _WINSOCKAPI_ in the Qt project config file (*.pro) has solved it.