2010-10-31 6 views
7

Получение кучи (105) redefine & ошибки синтаксиса при попытке скомпилировать проект VS2008 C++ с включенным <winsock2.h>. Запуск Windows 7 64 бит. У меня есть поиск в googled и поиск, и ответ кажется довольно однородным, но, похоже, это не работает для меня.VS2008 Ошибка компиляции с <winsock2.h>

Пробовал сдавать #include <winsock2.h> до #include <windows.h>. Также попробовал не включать <windows.h> (поскольку winsock2 включает его автоматически, если отсутствует).

Пробовал с #define WIN32_LEAN_AND_MEAN и/или #define _WINSOCKAPI_ ранее.

В компоновщике -> дополнительные зависимости Я ссылался на ws2_32.lib. Также пытался #pragma comment(lib, "ws2_32.lib").

Я перестраиваю все решение на всякий случай.

Обычная ошибка (разделяемая многими, кажется):

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 

... и т.д., и т.д..

Любые предложения будут оценены.

ответ

12

У меня есть заголовок «WinsockWrapper.h», который помогает мне обеспечить согласованность ... Суть его заключается в следующем:

#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") 

Включите эту опцию, прежде чем что-либо другое, что может тянуть в windows.h в любой файл, который нуждается в winsock2.h

Это, ИМХО означает положить его в верхней части большинства файлов, которые нуждаются в winsock2.h ..

Убедитесь, что ваш предварительно скомпилированный заголовок, если вы его используете, также имеет это первое.

1

Это хорошо известная проблема. Каким-то образом MS сделал winsock.h и winsock2.h несовместимым. Эта проблема существует с MSVC 6.

Это только один из файлов, которые вы включили также winsock.h, в то время как вы позже включить winsock2.h

Одним из способов исправить это в том числе winsock2.h первый. Даже до windows.h (он будет автоматически включать windows.h)

2

Оказывается < windows.h> был вызван в другом месте проекта (отдельный файл .h) и до указанного выше файла .h. Это то, что я получаю для кодирования поздно. Спасибо за помощь, оценили.

Я заменил это < windows.h> с < winsock2.h> и теперь он работает нормально.

Включает < mmsystem.h> начиная с случайного предоставления мне проблем после этого, хотя (каждый другой компилятор). Я получил его инкапсулированным с #ifdef _WIN32, но все же он кажется случайным. Сохраняя проект после того, как последний раз он скомпилировался успешно (каждый раз) и перезапустил VS2008, похоже, он «исправил» его. Ошибка была внутренней ошибкой компоновщика (получил ссылку на mms lib).

Смежные вопросы