Переопределение (WinSock2.h, winsock.h, ws2def.h) при использовании OR-Tools в Qt - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю пользовательский интерфейс с Qt для Googles OR-Tools, и при попытке построить журналы идем в тупик с переопределениями ...

Соответствующая часть моего файла проекта 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;

Но это может помочь ...

Что очень сбивает с толку, так это то, что когда я использовал это же включение в другой тестовый проект 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 Bit и amна Win10

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

Добавление DEFINES += _WINSOCKAPI_ в файл конфигурации проекта Qt (* .pro) решило это.

0 голосов
/ 03 апреля 2019

Я мало что могу сделать, это все зависимости.

Из того, что я вижу, protobuf включает в себя time_util.h, который перетаскивает winsock2.h

Я не нахожу, что включает в себя окна.h from cp_model.h

Это из Qt?

В любом случае, вы можете инкапсулировать весь код or-tools в файл cpp, который не содержит ничего подозрительного (например, QT)?

...