2010-06-17 71 views
3

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

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命令注册表输入密码。真的不知道该从哪里出发,欣赏任何建议。 。 。

+1

这不会是任何与您的DLL。你能发布你的代码吗? – Anthony 2010-06-17 05:46:56

+2

尝试在windows.h之前包括winsock2.h – INS 2010-06-17 07:18:43

+0

请勿移动winsock.dll。它是Windows的一部分。您可能会发现任何建议,建议您将解决方案的历史追溯到Windows 3.1的日子。对于这个问题,winsock.dll也是如此 - 我的意思是从Windows 3.1开始的日期;在32位平台上,您使用wsock32.dll(Winsock 1.1)或ws2_32.dll(Winsock 2.x)。正如Duracell所说,你的问题无论如何都是别的。 – 2010-06-17 19:34:12

回答

2

windows.h包含winsock.h,它与winsock2.h包含文件相冲突。 防止第一包含定义WINSOCKAPI你包括WINDOWS.H之前:

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

非常感谢。更改标题的顺序包括修正编译错误。再次谢谢你。 ioil – ioil 2010-06-18 08:50:09

2

通过尤利安Şerbănoiu

#include <winsock2.h> 
#include <windows.h> 
的建议,你应该把winsock2.h的WINDOWS.H之前

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

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

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

原因是MSDN上描述:(?这取决于你使用的IDE,比如Visual Studio中)Creating a Basic Winsock Application

另外,还要确保你的程序链接到WS2_32.LIB文件
在Visual工作室,你去项目>属性>链接器>其他包括(或类似的东西,目前不在计算机与视觉工作室..)这也在上面的链接描述。

1
#pragma comment(lib, "wininet.lib") 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 

使用这种避免编译错误