【问题标题】:winsock compile errorwinsock编译错误
【发布时间】:2010-06-17 05:38:59
【问题描述】:

以下错误来自仅包含 windows 和 winsock2 的文件。

C:\Users\ioil\Desktop\dm\bin>dmc sockit.c
typedef struct fd_set {
                      ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(85) : Error: 'fd_set' is already defined
} fd_set;
^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(88) : Error: identifier or '( declarator )' expected
struct timeval {
               ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(129) : Error: 'timeval' is already defined
};
^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(132) : Error: identifier or '( declarator )' expected
struct  hostent {
                ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(185) : Error: 'hostent' is already defined
Fatal error: too many errors
--- errorlevel 1

C:\Users\ioil\Desktop\dm\bin>

已经尝试过的:将winsock.dll文件与编译器和要编译的程序放在同一个目录下,放在system32目录下,用regsrv32命令进入注册表。真的不知道从哪里开始,感谢任何建议。 . .

【问题讨论】:

  • 这与您的 DLL 无关。你能发布你的代码吗?
  • 尝试在 windows.h 之前包含 winsock2.h
  • 不要移动 winsock.dll。它是 Windows 的一部分。您可能发现的任何建议将其作为解决方案都可以追溯到 Windows 3.1 时代。就此而言,winsock.dll 也是如此——我的意思是,它可以追溯到 Windows 3.1;在 32 位平台上,您使用 wsock32.dll (Winsock 1.1) 或 ws2_32.dll (Winsock 2.x)。正如金霸王所说,你的问题是另外一回事。

标签: c winsock winsock2


【解决方案1】:

windows.h 包含 winsock.h,它与 winsock2.h 包含文件冲突。 通过在包含 windows.h 之前定义 WINSOCKAPI 来防止第一次包含:

#define _WINSOCKAPI_ 
#include "windows.h"
#include "winsock2.h"

【讨论】:

  • 非常感谢。更改标头的顺序包括修复编译错误。再次谢谢你。油
【解决方案2】:

您应该按照 Iulian Şerbănoiu 的建议将 winsock2.h 放在 windows.h 之前

#include <winsock2.h>
#include <windows.h>

您也可以使用精益和平均宏:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>

原因在msdn上有描述:Creating a Basic Winsock Application

还要确保将程序链接到 WS2_32.lib 文件(这取决于您使用的 IDE,例如 Visual Studio?)
在 Visual Studio 中,您转到项目 > 属性 > 链接器 > 附加包含(或类似的东西,目前不在具有 Visual Studio 的计算机上。)这也在上面的链接中进行了描述。

【讨论】:

    【解决方案3】:
    #pragma comment(lib, "wininet.lib")
    #pragma comment (lib, "Ws2_32.lib")
    #pragma comment (lib, "Mswsock.lib")
    #pragma comment (lib, "AdvApi32.lib")
    

    使用这个避免编译错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多