2010-10-31 7 views
7

Uzyskiwanie kuponów (105) na nowo definiuje błędy składniowe & podczas próby kompilacji mojego projektu C++ VS2008 z <winsock2.h>. Uruchamianie Windows 7 64bit. Mam googlowane i przeszukiwane, a odpowiedź wydaje się dość jednolita, ale wydaje się, że nie działa dla mnie.VS2008 Błąd kompilacji z <winsock2.h>

Próbowałem oddanie #include <winsock2.h> przed #include <windows.h>. Próbowano również nie włączać <windows.h> (ponieważ winsock2 zawiera go automatycznie, jeśli go brakuje).

Próbowano z #define WIN32_LEAN_AND_MEAN i/lub #define _WINSOCKAPI_ przed.

W łączu -> dodatkowe zależności mam odniesienia ws2_32.lib. Próbowano również #pragma comment(lib, "ws2_32.lib").

Przebudowuję całe rozwiązanie na wszelki wypadek.

błąd zwykle (podzielane przez wielu wydaje):

Error 5 error C2011: 'sockaddr' : 'struct' type redefinition c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 206 RallyAction 
Error 6 error C2143: syntax error : missing '}' before 'constant' c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 384 RallyAction 
Error 7 error C2143: syntax error : missing ';' before 'constant' c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 384 RallyAction 
Error 8 error C2059: syntax error : 'constant' c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h 384 RallyAction 

... etc, etc.

Wszelkie sugestie będą mile widziane.

Odpowiedz

12

Mam nagłówek "WinsockWrapper.h", który pomaga mi zapewnić spójność ... Istota tego;

#ifndef _WINDOWS_ 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#undef WIN32_LEAN_AND_MEAN 
#endif 

#include <winsock2.h> 

#pragma comment(lib, "ws2_32.lib") 

włączenia tego zanim cokolwiek innego co może pociągnąć w windows.h w dowolnym pliku, który potrzebuje winsock2.h

to IMHO oznacza umieszczenie go na szczycie większości plików, które muszą winsock2.h ..

Upewnij się, że prekompilowany nagłówek, jeśli używasz go, również ma to pierwsze.

1

Jest to dobrze znany problem. W jakiś sposób stwardnienie rozsiane sprawiło, że winsock.h i winsock2.h są niezgodne. Ten problem istnieje od MSVC 6.

To tylko jeden z plików, które zawierają także winsock.h, a później m.in. winsock2.h

Jednym ze sposobów, aby rozwiązać ten problem jest w tym winsock2.h pierwszy. Nawet przed windows.h (będzie to automatycznie windows.h)

2

Okazuje się, że < windows.h> został wywołany w innym miejscu w projekcie (oddzielny plik .h) i przed powyższym plikiem .h. To właśnie dostaję za późne kodowanie. Dzięki za pomoc, doceniona.

Wymieniłem ten < windows.h> dzwoniąc z < winsock2.h> i teraz działa dobrze.

obejmują < mmsystem.h> zaczynając losowo dając mi później problemy (co druga kompilacja). Dostałem to zamknięte w #ifdef _WIN32, ale nadal wydaje się losowe. Po zapisaniu projektu po ostatnim jego pomyślnym skompilowaniu (co drugi raz) i ponownym uruchomieniu VS2008 wydaje się, że "naprawił" go. Błąd był wewnętrznym błędem linkera (dostałem odwołanie do biblioteki mms).