【问题标题】:Windows Winsock redefinition errors regarding asio/SteamAPI/libssh/SDL_net关于 asio/SteamAPI/libssh/SDL_net 的 Windows Winsock 重新定义错误
【发布时间】:2022-11-01 11:43:29
【问题描述】:

每当我尝试在同一个(CMake)项目中使用超过 1 个网络库时,都会出现许多 Winsock 重新定义错误。这些库是 asioSteamAPIlibsshSDL_net 等等。

我转向谷歌寻求答案,关于这个问题有很多帖子。很多人提出了如何解决这个问题,例如在包含Windows.h之前定义WIN32_LEAN_AND_MEAN,或者两次不包含Windows.h......我已经删除了Windows.h的所有用法。我还尝试了许多不同的答案,希望能够编译我的程序。这没什么区别。

在所有可用的答案中,没有一个答案可以解决这个问题。大多数答案确实指出这是一个仅限 WindowsAPI 的问题,因为它试图包含旧的Winsock.h

有没有办法同时使用上面提到的网络库而不会出现这些错误?

【问题讨论】:

    标签: winapi winsock asio libssh sdl-net


    【解决方案1】:

    winsock.h 不与 winsock2.h 共存。 winsock2.h 旨在替换 winsock.h,而不是扩展它。因此,winsock2.h 声明了 winsock.h 也声明的所有内容。

    如果首先包含winsock2.h,那么它会禁用winsock.h,一切都很好,但是如果首先包含winsock.h,那么您会收到这些类型的重新声明错误。

    因此,解决方案是确保winsock2.h 包含在winsock.h 之前。

    例如,通过在windows.h(包括winsock.h)和所有其他套接字库之前包含winsock2.h。您还可以定义WIN32_LEAN_AND_MEAN,因此windows.h 不包括winsock.h

    【讨论】:

      【解决方案2】:

      我相信我已经找到了解决这个问题的方法。它涉及修改位于C:Program Files (x86)Windows KitsInclude<version>um 中的Windows.h

      这是因为Windows.h 包含的所有垃圾都位于WIN32_LEAN_AND_MEAN#ifndef 部分中,包括Winsock.h

      使用文本编辑器删除 #ifndef WIN32_LEAN_AND_MEAN 部分。它的长度应该约为 21 行。删除后,将 `#include <Winsock2.h> 添加到该部分的位置。您的计算机可能会要求获得保存文件的权限。

      这对我有用,我不能保证它对你有用,但它非常应该。希望这可以帮助。

      【讨论】:

      • 或者,只需在您的代码中定义WIN32_LEAN_AND_MEAN,然后添加#include &lt;WinSock2.h&gt;...
      猜你喜欢
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多