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

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

07.03.2017, 06:20

C++ | MSVC Linker Bug (?)

Hi,
bei mir meckert aktuell der Compiler, weil er stets eine Funktion angeblich nicht finden kann.
Folgendes Szenario: [Header A.hpp]

C-/C++-Quelltext

1
2
3
4
5
namespace awesome{
    void function_a();
    void function_b();
    void function_c();
}


[Source A.cpp]

C-/C++-Quelltext

1
2
3
4
5
namespace awesome{
    void function_a(){ //... }
    void function_b(){ //... }
    void function_c(){ //... }
}


An dieser Stelle beschwert sich der Linker, dass er "function_c" nicht finden kann,
obwohl die Signatur von Deklaration und Definition übereinstimmen und namespaces gleich sind.

Hier ist mir das sonderbare Verhalten des Linkers aufgefallen:

1. Kommentiere function_c in der Source-Datei aus.
2. Definiere function_c im Header
3. Entferne Definition im Header
4. Entkommentiere function_c in der Source-Datei.
5. Et voilá, der Linker findet das Symbol.

Ist jemand schonmal auf diesen Bug gestoßen und weiß wie man diesen umgehen kann?
Sind da ev. schon Updates oder so online?

LG Julien

EDIT:
Ähnliches Verhalten lässt sich auch mit Methoden beobachten.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (07.03.2017, 06:30)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.03.2017, 06:30

Das klingt eher danach, dass er die Source-Datei nicht neu kompiliert hat oder beim inkrementellen Build einen Fehler gemacht hat - also der Compiler, nicht der Linker. Kommt durchaus vor. "Rebuild all" hilft. Ich habe das allerdings nur sehr selten und meist nach wilden Rebase-Aktionen, wo er nicht merkt, dass die Datei sich geändert hat, weil sie dasselbe Datum trägt. Ich persönlich deaktiviere diesen minimal-Build-Quatsch und verwende stattdessen Multi-CPU-Build (beide Optionen gleichzeitig sind nicht erlaubt). Das ist am Ende eh wesentlich fixer (bei 8 Kernen).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

07.03.2017, 06:43

Leider scheint es tatsächlich so gewesen zu sein, dass die Source-Datei nicht neu kompiliert wurde.
Alle "Clean Build"-Versuche versagten dabei.

---

Habe gerade den Fehler entdeckt.

[Irgendeine andere Datei B.hpp]

C-/C++-Quelltext

1
2
3
4
namespace awesome{
    class Event;
    void foo(Event& ev){ function_c(ev));
}


[A.hpp]

C-/C++-Quelltext

1
2
3
4
namespace awesome{
    struct Event;
    void function_c(Event& ev);
}


Eine kleine Änderung gemacht und kurz nicht aufgepasst :wacko:
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

07.03.2017, 06:51

Bei sowas solltest du allerdings eine Meldung bekommen bezüglich Neudeklaration.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

08.03.2017, 17:41

Ich setzte mal das "Warnlevel" hoch, eventuell kommt dann etwas. Bisher gab's nur den Linkerfehler.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.03.2017, 19:03

Bei sowas solltest du allerdings eine Meldung bekommen bezüglich Neudeklaration.

Sogar ganz bestimmt, aber natürlich nur, wenn es wirklich eine .cpp Datei gibt, die beide Deklarationen included, ansonsten kann der Compiler das Problem niemals finden, da er es rein prinzipiell nie zu Gesicht bekommt...

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

10.03.2017, 16:59

Tatsächlich werden nicht beide included. Ich habe etwas ähnliches wie das PIMPL-Idiom angewendet,
wobei es in der Implementierungsdatei zu besagten Problemen kam.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige