[C++]Linker 2005 error

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Goeiemorgen,

Ik zit nu met een probleem waar ik de oorzaak niet van snap
Ik probeer mijn programma te compilen en hierna te linken, bij het linken krijg ik verschillende errors:

C++:
1
BumpEarth.obj : error LNK2005: "class RakPeerInterface * rakPeer" (?rakPeer@@3PAVRakPeerInterface@@A) already defined in buildings.obj


buildings.h bevat de volgende items
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#ifndef BUILDINGS_H
#define BUILDINGS_H

#include "dxstdafx.h"

class Game;

class buildings
{
//class def
}
#endif


buildings.cpp
C++:
1
2
3
4
#include "buildings.h"
#include "Game.h"

//method def


en BumpEarth.cpp heeft als engiste include
C++:
1
#include "Game.h"   // game class


en in Game.h include ik alle headers die ik nodig heb, onder andere headers van rakpeer(deze worden nergens anders include). Maar ook Game.h is omringt door
C++:
1
2
3
4
5
6
7
#pragma once
#ifndef GAME_H
#define GAME_H

//overige includes + class def

#endif

Ik was in de veronderstelling dat de pre-compiler #ifndef & #define ervoor zouden zorgen dat een header niet meerdere keren word gelinked, misschien kan iemand mij een duwtje in de rug regen m.b.t. de oorzaak, Ik heb zelf al op google gezocht naar mogelijke oplossingen alsmede met de compile / link opties zitten spelen.

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Ok, ik ben inmiddels een stapje verder, de pre-compiler #define's zijn dus uniek voor elke compile-unit (cpp + h) en voorkomen daarom niet dat er niet meerdere keren word ge-include. Maar hoe zorg ik er nu voor dat ik in buildings.h nog steeds een pointer naar m'n gameclass kan gebruiken?

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Je declareert een pointer in een header file, zodat alle translation units (.cpp's) die die header includen weten dat die pointer bestaat.

Je doet bijvoorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
//in a.h
extern foo *p; // <-- declaratie, mag meerdere keren voorkomen

//in a.cpp
#include "a.h"
foo *p; // <-- definitie, moet exact 1x voorkomen
p->bar(); // <-- gebruik van de pointer

//in b.cpp
#include "a.h"
p->bar(); // <-- gebruik van de pointer


Zie duidelijk het verschil tussen declaratie (zodat je het kan gebruiken) en definitie (de implementatie). Hetzelfde gaat op voor classes, je declareert functies in de header, en definieert (implementeerd) in de .cpp file.

Een definitie komt exact 1x voor (zodat de linker het "begrijpt"). De makkelijkste manier is om definities dus in een enkele .cpp file te zetten :)

(Er zijn uitzonderingen op deze "regel" zoals bv. inline functies en COMDAT secties etc, maar in jouw geval denk ik niet dat je je daar direct druk om hoeft te maken)

-niks-


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
dus waar ik in mijn game.h heb staan:
C++:
1
2
3
4
5
6
7
8
class game
{
public: 
//functie declaraties

public:
LPDIRECT3DTEXTURE9 m_pddsTexture[textureC]; //variabele definities
LPDIRECT3DTEXTURE9 m_pddsLights[textureC];

Is dat dus eigenlijk slecht, want dat is een definitie toch ?
Maar als ik dan vanuit een andere class m_pddsTexture wil benaderen, dan deed ik did tot nu toe met:
C++:
1
2
//ergens in building.cpp 
game->mpddsTexture

Zodra ik de definitie naar de translation unit verhuis dan kan ik dit niet meer toch?



Nu ik in mijn game.h het volgende gezet heb:
C++:
1
extern Game* game;


en in mijn building.cpp
C++:
1
2
3
4
#include building.h
#include game.h

Game* game;

krijg ik een error:
code:
1
1>: error C2071: 'Game::game' : illegal storage class

[ Voor 20% gewijzigd door CRiMiNaL op 22-03-2009 11:45 ]

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Je class is goed opgezet hoor. Wat jij daar hebt is een declaratie van een class.

C++:
1
2
3
4
5
6
7
8
9
10
11
//in foo.h
//dit is een class declaratie
class foo
{
public:
  int a;
  void bar(); 
}; //<-- **

//pointer declaratie
extern foo *f;
C++:
1
2
3
4
5
6
7
8
9
10
11
//in foo.cpp
#include "foo.h"

//dit is class definitie
void foo::bar()
{
  //code
}

//dit is de pointer definitie
foo *f;
C++:
1
2
3
4
5
6
7
8
//in main.cpp
#include "foo.h"

//voorbeeld code
int main(int, char**)
{
  f->bar();
}


Niet getest, maar dit zou moeten compilen en linken zonder problemen..

Bij nader inzien, volgens mij mis jij de afsluit accolade in je game.h, ik heb em gemarkeerd met ** in mijn voorbeeld.

-niks-


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Bedankt voor je duidelijke uitleg!

Ik was de accolade niet vergeten, ik ben er nu alleen achter dat er in een oude header file van mijzelf nog verschillende definities van variabelen staan waar ik niet naar gekeken heb.
C++:
1
2
//in globals.h
const D3DXVECTOR3 centerC=D3DXVECTOR3( 0.0f, 0.0f, 0.0f );


heel vies, maar ik vermoed dat dit de oorzaak is.

... MMORPG Addict.

Pagina: 1