2010-06-17 96 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") 

使用這種避免編譯錯誤