14
votes

I'm having a problem including both files. Now, I know I need to either include Winsock2 first, then windows.h, or simply put:

#define WIN32_LEAN_AND_MEAN

but, I'm still having problems

I have a header file that is called XS.h which looks like this

#ifndef XS_H
#define XS_H

#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>

#endif

and I'm including XS.h in the header Client.h. Client.h include is looks like this :

#ifndef CLIENT_H
#define CLIENT_H

#include "XS.h"

XS.h is my only include in Client.h, yet I still get errors (and as you can see, Winsockis included before windows.h

I'm getting about 78 errors, here are some of them :

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

How can I solve this issue?

Thanks!

Edit: I've tried to use #define _WINSOCKAPI_ as well, though it did not resolve my problems... I have winsock.h first, then windows.h, though it still does the error for me.

3
use #pragma once in header fileA B
I suggest to always include windows.h and windowsx.h first, in every source file (preferably using the stdafx.h file). I'm not sure it solves this particular problem, but it reduces confusion a lot.PMF
I've changed Client.h includes to this : #pragma once #include <winsock2.h> #include <ws2tcpip.h> #include "Chat.h" though it still doesnt work, same errors....Amit
MIcrosoft's "Intellisense" doesn't use the same analysis engine as the compiler proper, and so it can and does spit out "error messages" for perfectly valid code. That said, this sounds as a real problem, not just an Intellisense apparent-problem. You should always include windows.h before including any other Windows API header. That's because Microsoft headers generally do not include all that they need, i.e. do not follow good programming practice. It's possible to just make <windows.> a forced include, but that repeats the malpractice that caused the problem: better fix the source.Cheers and hth. - Alf

3 Answers

19
votes

Make sure that <windows.h> doesn't include <winsock.h> (which provides many of the same declarations as <winsock2.h>). In the <winsock2.h> file on my system there is this line:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

The _WINSOCKAPI_ include guard may be an internal implementation detail, but as a practical solution I would rely on it, just defining this symbol before including <windows.h>, e.g. in the compiler invocation (which for an IDE means in the IDE project settings).

Alternatively you can try to always include <winsock2.h> before <windows.h>, in order to establish the relevant include guard whatever it is (but this is I think much more fragile than just assuming that the above guard is practically well-defined);

or you can define WIN32_LEAN_AND_MEAN, which prevents <windows.h> from including <winsock.h> but also some other headers (listing from source on my system those are <cderr.h>, <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>, and <commdlg.h>). I do not recommend relying on WIN32_LEAN_AND_MEAN optimization for correctness.

I.e., minimum:

#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>

auto main()
    -> int
{}
5
votes

I made sure that an #include "Winsock2.h" is before any #include "windows.h" and "#include "Winsock.h" and this solved the case.

Just a matter of patience, look at includes one by one and establish this order, first #include "Winsock2.h" then #include "windows.h"

I checked the recursive includes, I spotted the header files which include (recursively) some #include "windows.h" and "#include "Winsock.h"and write a#include "Winsock2.h". in this files, i added#include "Winsock2.h"` as the first include.

0
votes

Add the includes to 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")