Toon posts:

[C++] Compile error

Pagina: 1
Acties:

Verwijderd

Topicstarter
Bij het compileren van een plugin in de Ogre 3D engine krijg ik steeds de error:
src/OgreRefAppWorld.cpp:132: function `static OgreRefApp::World&
OgreRefApp::World::getSingleton()' definition is marked dllimport
Hierover kan ik niks informatiefs terugvinden op google. Bij mijn wete is de compiler goed ingesteld, want alle andere code compileert perfect. Enkel die ene member dus niet.

De code (copyright Ogre www.ogre3d.org):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// OgreRefAppWorld.cpp

    World& World::getSingleton(void)
    {
        return Singleton<World>::getSingleton();
    }


// OgreRefAppWorld.h


        /** Override standard Singleton retrieval.
            @remarks
                Why do we do this? Well, it's because the Singleton
                implementation is in a .h file, which means it gets compiled
                into anybody who includes it. This is needed for the
                Singleton template to work, but we actually only want it
                compiled into the implementation of the class based on the
                Singleton, not all of them. If we don't change this, we get
                link errors when trying to use the Singleton-based class from
                an outside dll.
            @par
                This method just delegates to the template version anyway,
                but the implementation stays in this single compilation unit,
                preventing link errors.
        */
        static World& getSingleton(void);


Ik voel me heel erg dom :$

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

als de class __declspec (dllimport) is zijn al z'n members ook __declspec (dllimport). Je moet de implementatie dus ook __declspec (dllimport) maken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op 10 maart 2004 @ 00:23:
als de class __declspec (dllimport) is zijn al z'n members ook __declspec (dllimport). Je moet de implementatie dus ook __declspec (dllimport) maken
Sorry, mijn kennis over dll's maken/compilen gaat niet veel verder dan de compile-knop in het ide :$ kan je me wat meer uitleg of een praktisch voorbeeld geven?

De klasse is inderdaad __declspec( dllimport ) maar hoe doe ik dit in de implementatie?

deze doet het niet, want die geeft dezelfde compileerfout:
code:
1
2
3
4
     __declspec( dllimport )World& World::getSingleton(void)
    {
        return Singleton<World>::getSingleton();
    }

[ Voor 3% gewijzigd door Verwijderd op 10-03-2004 00:39 ]


Verwijderd

Verwijderd schreef op 10 maart 2004 @ 00:39:
[...]

Sorry, mijn kennis over dll's maken/compilen gaat niet veel verder dan de compile-knop in het ide :$ kan je me wat meer uitleg of een praktisch voorbeeld geven?

De klasse is inderdaad __declspec( dllimport ) maar hoe doe ik dit in de implementatie?

deze doet het niet, want die geeft dezelfde compileerfout:
code:
1
2
3
4
     __declspec( dllimport )World& World::getSingleton(void)
    {
        return Singleton<World>::getSingleton();
    }
http://www.google.nl/sear...2B%2B+dll+programming&lr=
:Z
Beetje zelf initiatief kan geen kwaad.

[ Voor 6% gewijzigd door Verwijderd op 10-03-2004 01:14 ]


Verwijderd

Topicstarter
Deze vond ik na 20 minuten zoekwerk, hij lijkt me ietwat duidelijk:
http://www.codeguru.com/C...orials/article.php/c4017/


Wat ik dus denk te begrijpen:
In de header wordt gezegd dat de static getsingleton() moet geimporteerd worden vanuit een dll, maar dat dit in de implementatie niet staat. Maar dan anderzijds: die functie wordt geimplementeerd, dus die kan toch niet tegelijk worden geimporteerd en geimplementeerd?

[edit]en het moet toch dllexport zijn als je een dll voor een afzonderlijke app maakt?

[ Voor 10% gewijzigd door Verwijderd op 10-03-2004 01:53 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh darn 8)7 duh! :P
Hij is idd gewoon dllimport, waarom implementeer je 'm dan? Dat is de hele error :)

Maar ik neem aan dat ie niet geimporteerd moet worden, aangezien je 'm zelf wilt implementeren. Misschien kun je even uitleggen wat je precies wilt doen, en hoe de gebruikte dll en class structuur eruit ziet?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb geen idee waarom het precies is :x daarom dat ik ook geen oplossing weet...

Wel belangrijk (denk ik...) is dat er in de header staat:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        /** Override standard Singleton retrieval.
            @remarks
                Why do we do this? Well, it's because the Singleton
                implementation is in a .h file, which means it gets compiled
                into anybody who includes it. This is needed for the
                Singleton template to work, but we actually only want it
                compiled into the implementation of the class based on the
                Singleton, not all of them. If we don't change this, we get
                link errors when trying to use the Singleton-based class from
                an outside dll.
            @par
                This method just delegates to the template version anyway,
                but the implementation stays in this single compilation unit,
                preventing link errors.
        */
        static World& getSingleton(void);

*me not snap*

Hier is de api referentie:
http://www.ogre3d.org/doc...sOgreRefApp_1_1World.html


[edit]
Hier is de code van de klasse in de header:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
//-------------------------------------------------------------------------
template<> OgreRefApp::World* Ogre::Singleton<OgreRefApp::World>::ms_Singleton = 0;
//-------------------------------------------------------------------------
namespace OgreRefApp
{
    //-------------------------------------------------------------------------
    World::World(SceneManager* sceneMgr, WorldType worldType)
        : mSceneMgr(sceneMgr), mWorldType(worldType)
    {
        // etc...
    }

// ... etc ...


't Heeft iig iets te maken met het veilig stellen van de template code ivm de export van die template code denk ik.

[edit2] Ik denk dat hij enerzijds moet geimplementeerd worden voor de code die de dll bevat en op een andere manier beschikbaar moet zijn voor de gebruikers van de dll?

*soms sla ik gewoon wartaal uit* :+

[ Voor 35% gewijzigd door Verwijderd op 10-03-2004 02:05 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mja, ik snap wel wat ze ermee bedoelen, maar wat ik wilde weten is wat jouw rol is in deze code. Ik neem aan dat de code die jij wilt compileren gewoon van Ogre zelf is, en dat jij daar dus niets voor hebt geschreven? De code van ogre compileert waarschijnlijk naar een dll. Dat betekent dat die class tijdens het bouwen van de dll als dllexport gedeclareert moet zijn (die klasse wordt geexporteerd uit de dll), en bij het gebruik van die klasse moet het dllimport zijn (jij gebruikt die klasse uit de dll, dus je importeert 'm).

Als je idd gewoon de ogre dll wilt bouwen dan klopt die dllimport niet; dat moet dllexport zijn. Waarschijnlijk wordt dit geregeld met een één of andere define, maar daar kan ik natuurlijk geen zinnig woord over zeggen daar ik de exacte broncode niet ken (en überhaupt geen zin heb om die door te spitten ;))

.edit: ah, het gaat hierom.
C++:
45
46
47
48
49
50
51
52
53
54
#if OGRE_PLATFORM == PLATFORM_WIN32
// Export control
#   if defined( REFERENCEAPPLAYER_EXPORTS )
#       define _OgreRefAppExport __declspec( dllexport )
#   else
#       define _OgreRefAppExport __declspec( dllimport )
#   endif
#else // Linux / Mac OSX etc
#   define _OgreRefAppExport
#endif


is REFERENCEAPPLAYER_EXPORTS wel gedefinieerd?

[ Voor 3% gewijzigd door .oisyn op 10-03-2004 02:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op 10 maart 2004 @ 02:25:
Mja, ik snap wel wat ze ermee bedoelen, maar wat ik wilde weten is wat jouw rol is in deze code. Ik neem aan dat de code die jij wilt compileren gewoon van Ogre zelf is, en dat jij daar dus niets voor hebt geschreven?
Dat klopt, die code is een extra toevoeging voor de engine. Het kan bij de basiscode geplaatst worden. Een soort aanvullende library dus.
De code van ogre compileert waarschijnlijk naar een dll. Dat betekent dat die class tijdens het bouwen van de dll als dllexport gedeclareert moet zijn (die klasse wordt geexporteerd uit de dll), en bij het gebruik van die klasse moet het dllimport zijn (jij gebruikt die klasse uit de dll, dus je importeert 'm).
Jups dat klopt.
Als je idd gewoon de ogre dll wilt bouwen dan klopt die dllimport niet; dat moet dllexport zijn. Waarschijnlijk wordt dit geregeld met een één of andere define, maar daar kan ik natuurlijk geen zinnig woord over zeggen daar ik de exacte broncode niet ken (en überhaupt geen zin heb om die door te spitten ;))

.edit: ah, het gaat hierom.
C++:
45
46
47
48
49
50
51
52
53
54
#if OGRE_PLATFORM == PLATFORM_WIN32
// Export control
#   if defined( REFERENCEAPPLAYER_EXPORTS )
#       define _OgreRefAppExport __declspec( dllexport )
#   else
#       define _OgreRefAppExport __declspec( dllimport )
#   endif
#else // Linux / Mac OSX etc
#   define _OgreRefAppExport
#endif


is REFERENCEAPPLAYER_EXPORTS wel gedefinieerd?
Dan ga ik vanavond even alle geïnclude headers moeten checken, ik laat het hier weten :) (ik zit nu op m'n werk dus kan het niet openen/downloaden).

Verwijderd

Topicstarter
Als ik dit voor die code zet die je laatste poste:

C++:
1
#define REFERENCEAPPLAYER_EXPORTS 1


Dan geeft hij nog steeds dezelfde foutmelding *wordt wanhopig* Als ik deze code niet kan compileren dan kan ik de collisiedetectie niet gebruiken in de engine :'(

[edit] De compiler parameters zijn:
-DGCC_3_1 -DEXT_HASH -DWIN32 -DNDEBUG
Misschien ligt het daar aan?

[ Voor 20% gewijzigd door Verwijderd op 10-03-2004 22:10 ]


Verwijderd

Topicstarter
Weet echt niemand het? :'(

[edit] Ik zal het project dit weekend uploaden. Het is een Dev-cpp project.

[ Voor 75% gewijzigd door Verwijderd op 19-03-2004 13:55 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik denk dat je beter gewoon even Ogre kunt mailen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Nu heb ik ondertussen al enkele maanden zitten zoeken. Zelfs op het Ogre forum weten ze geen antwoord. Daar kreeg ik de reactie dat ze de GCC compiler niet ondersteunen... leuk is dat.

Na nog wat verder uitpluizen en google'n heb ik iemand gevonden met een soortgelijk probleem en ook een oplossing. Het probleem is dat ik niet snap wat hij bedoelt met z'n oplossing...

http://www.geocrawler.com.../6013/2000/12/50/4829160/

Kan iemand me uitleggen wat ik concreet moet doen?
Pleaaaase?

[edit] Volgens mij is het iets met de preprocessor definities ofzo. Hij wil blijkbaar de DLL linken ipv hem te gebruiken? Wat doe ik daar aan?

[ Voor 14% gewijzigd door Verwijderd op 20-05-2004 18:21 ]

Pagina: 1