Nicht definierte Referenz mit clang ++ mit O2

8

Ich probiere CLang 3.4 und libc ++ in einem Projekt aus und bekomme seltsame Verknüpfungsfehler im Freigabemodus:

%Vor%

Alles ist gut zusammengestellt. Das Programm verlinkt korrekt im Debug-Modus, aber nicht, wenn ich O2 verwende. In O0, O1 und Os funktioniert alles gut, aber es verbindet sich nicht in O2, O3, Os. Ich habe es auch im LTO-Modus versucht und es funktioniert gut.

Ich habe zwei Versionen von libc ++ ausprobiert, aber ohne Erfolg.

Der Code scheint mir nicht schlecht zu sein:

%Vor%

Aber ich habe kein einfaches Beispiel, das das Problem verursacht.

clang ++ wird sowohl zum Erstellen als auch zum Verknüpfen des Codes verwendet. Ich habe "-std = c ++ 1y -stdlib = libc ++" benutzt, um sie zu kompilieren und das selbe plus etwas Bibliotheksmaterial zum verlinken.

Was könnte das möglicherweise verursachen?

EDIT: Vollständiger Aufruf des Link-Schritts im Freigabemodus:

%Vor%     
Baptiste Wicht 09.04.2014, 19:46
quelle

2 Antworten

3

Ich hatte dieses Problem mit Code, der lange mit g ++ kompiliert wurde und versucht, mit clang ++ zu kompilieren. Die gleichen Symptome: undefinierte Verweise auf std :: __ 1 :: basic_ostream & lt; ... & gt; das ging magisch weg, als -O2 aus den Compiler-Optionen entfernt wurde. Alle ähnlichen Berichte, die ich fand, waren über falsches Verwenden clang anstelle von clang ++, um C ++ - Code zu kompilieren, aber das war nicht der Fall für mich: Ich benutzte clang ++.

Ich konnte schließlich feststellen, dass das Problem (für mich) #include <iosfwd> (das nur Iostream-Forward-Deklarationen verwendet, um die Kompilierzeiten zu reduzieren) in meiner header-Datei (.h) verwendet, die eine Klasse deklariert, aber nicht% co_de verwendet % in der entsprechenden Quelldatei (.cpp), die die Klasse implementiert.

Nachdem ich die #include <iostream> der Quelldatei hinzugefügt und neu kompiliert habe, sind diese undefinierten Referenzfehler verschwunden.

    
Michael Kirkham 24.01.2017, 22:35
quelle
1

Ich bemerke in der Fehlermeldung "std :: __ 1 :: operator & lt; & lt;". Im cpp-Code sehe ich "ast :: operator & lt; & lt;". Dadurch entsteht der Eindruck, dass mit den Namespaces etwas im Gange ist.

Nun weiß ich nicht, ob ast eine Klasse oder ein Namespace ist, aber in beiden Fällen sieht das ein bisschen aus.

Wenn ast eine Klasse ist, dann bin ich nicht sicher, ob der Operator & lt; & lt; ist als Klassenmitglied erlaubt. Sehen: Ссылка . Es schlägt vor, dass der Operator & lt; & lt; sollte als Freund implementiert werden, nicht als Mitglied der Klasse. Sie könnten versuchen, es zu einem Freund Methode machen und sehen, ob das das Problem behebt.

Wenn ast ein Namespace ist, würde ich versuchen, "asd ::" zu entfernen und separate Namespace-Deklarationen um die Definition hinzuzufügen.

    
Johan 16.04.2014 12:58
quelle

Tags und Links