我遇到了包含这两个文件的问题。 现在,我知道我需要首先包含Winsock2,然后是windows.h,或者简单地说:
#define WIN32_LEAN_AND_MEAN
但是,我仍然遇到问题
我有一个名为XS.h
的头文件,看起来像这样
#ifndef XS_H
#define XS_H
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>
#endif
我在标题XS.h
中加入了Client.h
。
Client.h
包含如下所示:
#ifndef CLIENT_H
#define CLIENT_H
#include "XS.h"
XS.h
是Client.h
中我唯一的内容,但我仍然会收到错误(正如您所见,Winsock
之前已包含windows.h
我得到了大约78个错误,其中一些是错误的:
Error 90 error C3861: 'WSASetLastError': identifier not found c:\program files (x86)\windows kits\8.0\include\um\ws2tcpip.h 703
Error 61 error C2375: 'WSAStartup' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h 2296
Error 49 error C2375: 'send' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h 2026
我该如何解决这个问题?
谢谢!
编辑:我也试过使用#define _WINSOCKAPI_
,虽然它没有解决我的问题......
我首先winsock.h
,然后windows.h
,但它仍然为我做错误。
答案 0 :(得分:15)
确保<windows.h>
不包含<winsock.h>
(其提供与<winsock2.h>
相同的许多声明)。在我系统的<winsock2.h>
文件中有这一行:
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
_WINSOCKAPI_
包含后卫可能是内部实施细节,但作为一种实用的解决方案,我会依赖它,只需在包含<windows.h>
之前定义此符号,例如在编译器调用中(对于IDE意味着在IDE项目设置中)。
或者你可以尝试always include <winsock2.h>
before <windows.h>
,以便建立相关的包含守卫(不管它是什么)(但我认为这比仅仅假设上面的守卫实际上定义得更加脆弱);
或者您可以定义WIN32_LEAN_AND_MEAN
,这会阻止<windows.h>
包含<winsock.h>
,但也会阻止其他一些标题(从我的系统来源列出<cderr.h>
,{{1} }},<dde.h>
,<ddeml.h>
,<dlgs.h>
,<lzexpand.h>
,<mmsystem.h>
,<nb30.h>
,<rpc.h>
,<shellapi.h>
,<winperf.h>
,<wincrypt.h>
,<winefs.h>
,<winscard.h>
,<winspool.h>
和<ole2.h>
)。我建议不要依赖<commdlg.h>
优化正确性。
即,最低限度:
WIN32_LEAN_AND_MEAN
答案 1 :(得分:3)
我确保#include "Winsock2.h"
位于任何#include "windows.h"
和"#include "Winsock.h"
之前,这就解决了这个问题。
只需耐心,请逐个查看并确定此订单,先#include "Winsock2.h"
然后#include "windows.h"
我检查了递归包含,我发现了包含(递归)一些#include“windows.h”和“#include”Winsock.h“的头文件,并在这个文件中写了一个#include”Winsock2.h“。 ,我添加#include“Winsock2.h”作为第一个包含。
答案 2 :(得分:0)
将包含添加到 pch.h:
// TODO: add headers that you want to pre-compile here
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")