VS2008 Ошибка компиляции с <winsock2.h> - PullRequest
7 голосов
/ 31 октября 2010

Получение куч (105) переопределенных и синтаксических ошибок при попытке скомпилировать мой проект VS2008 c ++ с включенным <winsock2.h>.Под управлением Windows 7 64bit.Я гуглил и искал, и ответ кажется довольно единообразным, но он не работает для меня.

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

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

В компоновщике -> дополнительные зависимости Iссылались на 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

... и т. Д.и т. д.

Будем благодарны за любые предложения.

Ответы [ 3 ]

13 голосов
/ 31 октября 2010

У меня есть заголовок "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

Это, IMHO, означает поставить его на вершину большинства файлов, которым требуется winsock2.h ...

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

2 голосов
/ 31 октября 2010

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

Я заменил этот вызов на , и теперь он работает нормально.

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

1 голос
/ 31 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...