#### Archived

This topic is now archived and is closed to further replies.

# error LNK2005:

## Recommended Posts

Jonppe    122
When I try to link my program. I get 2 errors. StdAfx.obj : error LNK2005: _IID_IDirectDraw4 already defined in Init.obj and other of same type of error about _GUID_SysKeyboard and I only use them in funktions QueryInteface and CreateDevice. I have also included all libraries needed(I think so) in stdafx.h .. so what to do? Thanks for your help.

##### Share on other sites
JoeyBlow2    100
That problem is because of this:

        CPP  ------   H  ----- Global Variables           /          /CPP ------

You are having to CPP files using 1 header file... This 1 header file is creating your global variables. This is generally a no-no... Why? Because the linker error you just got.

When the compiler linker is making code for the CPP... It says "Ok, I gotta make this global variable because its defined in this header file" then it gets to the next CPP file and says "Ok, I gotta make this global variable because its defined in this header file"... So now you have the global variable made twice!!! This is what the linker error is reporting. How do you fix it?

Easy. Only make the global variable once... But you can define it in the header file. What you do is createa another CPP file which has your global variables defined... and declare all global variables in the header file as "extern"...

Variables--           CPP--------- Header         /CPP------

That is one way, or you can dynamically skip the variable creation... Here is probably what it looks like now:

        struct _mystruct{  short myvar;} GlobalStruct;

Having GlobalStruct on the bottom is creating that global variable. You don't want that in a header file. You can have this dynamic skip by doing something like this:

struct _mystruct{ short myvar;}#ifndef _ALREADYDEFINED_  #define _ALREADYDEFINED_ _mystruct GlobalStruct;#endif

That way the _mystruct is always defined for all CPP's using this header, but only the first time this code is being ran through the compiler will acutally make the global variable "_mystruct GlobalStruct"... Because the first time its being run through the compiler the _ALREADYDEFINED_ is not defined... Then it defines it and creates the variable. So, next time the compiler is going through this header file (because another CPP file), things are already defined so it skips creating that variable... but the compiler knows the structure of the struct, which is all that is really needed...

Does that make sense?

Edited by - JoeyBlow2 on October 31, 2000 3:43:09 PM

Edited by - JoeyBlow2 on October 31, 2000 3:44:03 PM

Edited by - JoeyBlow2 on October 31, 2000 3:47:04 PM

##### Share on other sites
BigCarlito    122

#ifndef __SOME_UNIQUE_NAME_H__
#define __SOME_UNIQUE_NAME_H__

... All you header file defs and code ...

#endif

Good luck!

Zeus Interactive

##### Share on other sites
loco3d    122
Definitely just do it Big''s way. You should always have the #ifndef #define tags in every specification (.h) file.

LoCo3D

##### Share on other sites
SiCrane    11839
This could be because you''re defining INIT_GUID and linking against dxguid.lib. If you define INIT_GUID, you should do it in only one implemenation file, and not link against dxguid.lib.

##### Share on other sites
Jonppe    122
The problem that I noticed from SeCrane''s comment was that I defined INITGUID and not INIT_GUID
.. thanks

##### Share on other sites
Guest Anonymous Poster
BigCarlito: While your suggestion is a good one, it provides no solution to the linker error Jonppe describes. It will only prevent the compiler from including the same header file twice in the __same__ CPP-file (which would produce a compiler error, not a linker error). It will not prevent the compiler from including a header file in __different__ CPP-files.

The IID_IDirectDraw4 and GUID_SysKeyboard are declared in the DX-headers.