Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

16.09.2010, 22:18

VisualStudio 2010: unerwarteter Fehler

Hi,
ich will meine SoftPixel Engine jetzt endlich auch für VisualStudio 2010 rechtzeitig zum neuen Release vorkompiliert mit liefern.
Wenn ich ein Tutorial kompilieren will hängt es ausgerechnet an einer Funktion, die ich nicht mal im Ansatz berauche und auch nicht von außerhalb aufrufen kann, weil die Funktion private ist.
Angeblich sein ein externes Symbol nicht aufgelöst. Die Funktion is defakto definiert so wie alle anderen Funktionen dieser Klasse. Bei VisualStudio 2008 funktioniert alles bestens.
Hier die Fehlermeldung:

C-/C++-Quelltext

1
2
3
/*
1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: virtual bool __thiscall sp::tool::ParticleAnimator::updateParticle(class std::_List_iterator<class std::_List_val<struct sp::tool::SParticle *,class std::allocator<struct sp::tool::SParticle *> > > &)" (?updateParticle@ParticleAnimator@tool@sp@@MAE_NAAV?$_List_iterator@V?$_List_val@PAUSParticle@tool@sp@@V?$allocator@PAUSParticle@tool@sp@@@std@@@std@@@std@@@Z)".
*/


Und hier die Funktion:

C-/C++-Quelltext

1
virtual bool updateParticle(std::list<SParticle*>::iterator &it);


Vielleicht fällt dazu jemandem von euch was ein. Ich bin grade etwas planlos.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

16.09.2010, 22:24

Hiho,
so simpel wie es nur sein kann:

Die Funktion ist nicht definiert. xD
WIP Website: kevinheese.de

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

3

16.09.2010, 22:46

Das hilft ihm kein bisschen weiter, KeksX

Wir haben bisher vielleicht ein bisschen wenig informationen...
Hast du die Engine in VS2010 neu kompiliert? Lib-Pfade entsprechend gesetzt?
Irgendwelche platform-/compilerabhängigen #ifs o.ä. benutzt?
Mir kommt das ein wenig komisch vor... Schonmal Projekt bereiningt+Neu kompiliert?


mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

16.09.2010, 23:01

Naja, es ist doch eindeutig, dass wenn er nur den Funktionskopf nicht zeigt, den Rest aber nicht, da etwas fehlt. Oder ist die Funktion etwa definiert aber wird trotzdem nicht erkannt?
WIP Website: kevinheese.de

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

17.09.2010, 00:26

Könnte es sein, dass die .cpp, die die Definition enthält nicht korrekt mit ins Projekt eingebunden wird?
Der Linker findet die Funktion nicht, also wird die Implementierung nicht gefunden, was bedeutet, dass das File nicht korrekt eingebunden ist, es ein Tippfehler gibt (Unterscheidung gross<->klein?) oder die Signatur sonst nicht ganz passt, was vorher vlt. wegen Einstellungen ignoriert wurde.

Neu erstellen ist sicher eine gute Idee. Kommt immer mal wieder vor, dass es da ein Problem gibt.

6

17.09.2010, 09:29

Hi!

Wie schon gesagt wurde tritt der Fehler auf wenn sich Deklaration und Definition unterscheiden. Überprüfe mal die Signaturen ( Funktionsköpfe ) in der .h und .cpp auf Gleichheit. Möglicherweise hast du irgendwo eine kleine Abweichung z.B.: void Foo( const Bar& blub ) und void Foo( Bar& blub ) oder so.

Noch eine Möglichkeit wäre das du vielleicht den Klassennamen bei der Implementation vergessen hast. Sprich statt void Klasse::Funktion() nur void Funktion() geschrieben hast.

so long,
Chris

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

17.09.2010, 09:35

Mh, also ich werde mal versuchen alles zu bereinigen und neu zu kompilieren.
Wundert mich halt nur, weil der Kompiler bei anderen Funktionen dieser Klasse nicht mekert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class SP_EXPORT ParticleAnimator
{
        /* ... */
    protected:
        
        /* Functions */
        
        virtual bool updateParticle(std::list<SParticle*>::iterator &it); // HIER KNALLT'S (aber erst wenn diese Header Datei in dem Tutorial verwendet wird, obwohl ich diese Funktion nie aufrufe - da protected)
        
        virtual void setParticleAlpha(SParticle* Obj, const f32 Alpha);
        virtual void setParticleAlpha(SParticle* Obj);
};


und hier die definition:

C-/C++-Quelltext

1
2
3
4
bool ParticleAnimator::updateParticle(std::list<SParticle*>::iterator &it)
{
    /* ... */
}


Müsste eigentlich alles stimmen. Oder hab ich doch was übersehen?!

Ich versuch erst mal das ding zu bereinigen usw. :)

EDIT:
Also alles bereinigen und neu kompilieren bringt leider auch nichts. Ich hab echt keine Ahnung, warum außgerechnet alles an dieser einen Funktion hängt, die ich noch nicht mal verwenen will.
Selbst die gesammte Klasse verwende ich in dem Tutorial nicht.
Wahrscheinlich war das bei Visual C++ 2008 egal, wenn man die nicht mal ansatzweise verwendet hat.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (17.09.2010, 11:23)


8

17.09.2010, 11:24

Hm ja die stimmen soweit ich das sehe überein. Auf die Schnelle würde ich noch überprüfen ob auch die richtige Header eingbunden ist. Möglicherweise hast du 2 Versionen der Header und bindest noch eine ältere ein in der die Signatur noch eine andere ist.

Wird der Fehler geworfen beim Kompilieren der DLL oder bei dem Kompilieren einer Testapplikation für die DLL?
Wenn es bei der Testapplikation auftritt dann überprüfe ob die aktuelle Lib linkst und die aktuelle Header eingebunden hast. Es ist möglich das die Implementation in der Library unterschiedlich zu der Deklaration in der Headerdatei ist. Mehr fällt mir da leider auch nicht mehr ein.

Sonst mal auf die Experten warten :-) .

so long,
Chris

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GDChris« (17.09.2010, 11:30)


9

17.09.2010, 11:25

Hat drakon eigentlich alles gut zusammengefasst.

Hast du das alles mal durchgearbeitet und gecheckt?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

10

17.09.2010, 11:30

Wenn ich die Funktion aus der Header Datei auskommentiere geht's. Das ist aber nur ne Notlösung.
Die Header Datei ist auch die aktuelle. Ich kopiere die immer von sources/ nach include/.

Werbeanzeige