【问题标题】:Redefinition (WinSock2.h, winsock.h, ws2def.h) when using OR-Tools in Qt在 Qt 中使用 OR-Tools 时重新定义(WinSock2.h、winsock.h、ws2def.h)
【发布时间】:2019-04-03 13:59:21
【问题描述】:

我正在使用 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\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 位并且在 Win10 上

【问题讨论】:

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


【解决方案1】:

我能做的不多,这些都是依赖。

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

我没有从 cp_model.h 中找到包含 windows .h 的内容

它来自 Qt 吗?

不管怎样,你能把所有的 or-tools 代码封装在一个 cpp 文件中,其中不包含任何可疑的东西(比如 QT)吗?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2011-08-23
      • 2010-11-25
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多