it-swarm.com.de

"Symbol (e) für Architektur x86_64 nicht gefunden" im QtCreator-Projekt

Ich bekomme den Fehler

Symbol(s) not found for architecture x86_64

Versuch, ein Projekt auf QtCreator zu kompilieren. Dies passiert, wenn ich versuche, eine Instanz einer benutzerdefinierten Klasse Layer zu erstellen. Diese Klasse besteht aus einem Header layer.h und einer Implementierung layer.cpp. Es wurde getestet und funktioniert in anderen Programmen. In meinem Projekt ist es in qtwidget.h enthalten, und der Fehler tritt auf, wenn ich versuche, es mit qtwidget.cpp zu verwenden. Zum Beispiel:

Layer<double> text("pq.txt",0.5,0.5,0.5);

Wenn diese Zeile auf qtwidget.cpp steht, reicht es aus, dass der Fehler angezeigt wird.

Dies ist ein so generischer Fehler, dass ich keine Ahnung habe, wie ich ihn weiter isolieren kann, aber wenn es hilft, habe ich das gesamte Projekt in this git repo aufgenommen.

20
MaiaVictor

Meiner Meinung nach ist die Fehlermeldung, die Qt Creator anzeigt, ziemlich irreführend, bis Sie sie verstanden haben, sie verhindert jedoch nicht, dass die Vorlagenklasse in eine Header- und Implementierungsdatei aufgeteilt wird. Wenn Sie über die Nachricht nachdenken:

Symbol(s) not found for architecture x86_64

das Problem, dachte ich ursprünglich, als ich das sah, ist, dass es diesen Fehler in der Ausgabe Issues selbst aufführt und den Benutzer dazu bringen kann zu denken, dass das Problem auf die Architektur zurückzuführen ist. Eigentlich heißt das nur, dass es ein definiertes Symbol (oft eine Funktion) gibt, dessen passende Implementierung nicht gefunden wurde.

Wenn Sie von Issues in das Compile Output -Fenster wechseln und nach oben scrollen, können Sie genau sehen, welche Symbole nicht gefunden werden können. meine werden rot angezeigt. Es ist nur ärgerlich, dass die Details der fehlenden Symbole nicht in der Issues -Ansicht angezeigt werden.

Es ist einfach, diesen Fehler zu replizieren, indem Sie einfach eine Funktionsdefinition in einen Header einfügen und die Funktion ohne Implementierung der Funktion aus der CPP-Datei aufrufen. Sie sehen dann im Fenster "Probleme" etwas Ähnliches

symbol not found

Beim Umschalten in die Ansicht "Ausgabe kompilieren" und nach oben scrollen, wird Folgendes angezeigt: -

enter image description here

Nun sehen wir, dass das eigentliche Problem darin besteht, dass die Funktion DoSomeStuff in der Klasse PGGui vom Konstruktor PGGui :: PGGui aufgerufen wird, der Body von DoSomeStuff jedoch fehlt, da das Symbol nicht gefunden wird.

43
TheDarkKnight

Glücklicherweise habe ich es geschafft, mein Problem vor der Beantwortung zu lösen. Wenn also jemand etwas Ähnliches feststellt, besteht das Problem darin, dass Sie eine Klasse mit Vorlagen nicht in eine CPP- und eine eine .h-Datei . Das Problem wurde behoben, indem alle Deklarationen der Datei .cpp zurück in die Datei .h geschrieben wurden.

Ich hatte immer noch ein Restproblem: doppelte Symbole (das war der Grund, warum ich es geteilt habe). Dieses Mal löste das Deklarieren einer Variablen als external im .h und das erneute Deklarieren ohne das external-Schlüsselwort in einer (und nur einer) .cpp -Datei das Problem endgültig.

8
MaiaVictor

Für mich ist dieses Problem darauf zurückzuführen, dass die make-Datei nach dem Hinzufügen einer anderen Quelldatei und eines anderen Headers nicht neu erstellt wurde. 

Unter Build: Cleanall-> Run qMake-> Run 

behebte den Fehler für mich.

3
user5482467

Das Problem in meinem Fall war, dass ich ein Projekt mit vielen Unterprojekten hatte und eine der Pro-Dateien der Unterprojekte leer war. 

0
Matthias

Ich habe vergessen, den Namen des Klassenobjekts zu schreiben, als ich die Funktion in der .cpp-Datei deklarierte.

falsch: int Zero(int &num)

rechts: int Common2::Zero(int &num)

Wo Common2 die Klasse ist.

0
Cheng