In einem bereits bestehenden und ziemlich großen Projekt, ich bin die gcc-Compiler-Optimierung O1
aktivieren.C++ Linker Fehler bei der Verwendung von O1-Optimierung
Ohne diese Option baut, verbindet und läuft alles gut. mit der Option aktiviert, kompiliert die Hauptdatei und Links, aber ich bekomme Linker Fehler beim Verknüpfen eines der Komponententests.
Zwischen diesen beiden Kompilierungsläufen habe ich keinen Code geändert oder Dateien erstellt, nur das O1
Optimierungs-Flag.
Der Fehler, die ich bekommen ist:
Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'
Irgendwo während des Verknüpfungsprozesses es diese Linie trifft (Linie 123) von Builder.cpp
: CPP-Datei
pObject = Factory::Instance()->CreateObject();
(Neben dem Linkerfehler der Instance
Funktion, ich bekomme auch eine von der CreateObject
Funktion)
Wenn ich mir th Factory
e, ich sehe: Header-Datei
class Factory { public:
static Factory* Instance(); << rest of the file >>
Und in der CPP-Datei
Factory* Factory::sInstance = 0;
Factory* Factory::Instance() {
// Check if this is the first call
if (sInstance == 0)
{
// Create only instance
sInstance = new Factory();
}
// Address of the instance
return sInstance; }
Zuerst habe ich versucht, eine saubere und wieder aufzubauen, aber das hat nichts tun. habe ich auch nm verwendet, um Dumps der verwendeten Symbole Factory.o
(eins mit und ohne Optimierung) zu machen und diese zu vergleichen.
Ich sehe, dass einige Symbole entfernt werden, aber nicht die Factory::Instance()
eins. Ich sehe etwas mit der Adresse bezüglich dieser Funktion geändert, aber ich erwarte nicht, dass das ein Problem ist.
Auch über Google fand ich ein paar Möglichkeiten, aber ich konnte nichts finden, das zu meinem Problem passte.
hat jemand eine Idee, wie Sie dieses Problem finden?
Compiler-Version? Wie kompilierst du es (ist das Makefile kurz genug um es zu posten?)? Hast du sichergestellt, dass es das einzige ist, was du geändert hast (dh, wenn du das "-O1" wieder herausnimmst, kompiliert es dann erneut)? – us2012
Abgesehen von fehlender Thread-Sicherheit und irreführender Benennung ("Factory" ist wirklich eher etwas wie ein Singleton), sehe ich nichts anstößiges in dem Code, den du gezeigt hast.Wenn "-O1" wirklich das Einzige ist, was du geändert hast, sollte das gut funktionieren. Es sei denn, es gibt eine Bedingungsklausel im Makefile, die 'factory.cpp' nicht kompiliert, oder etwas, wenn Optimierungen aktiviert sind, aber das wäre ein bisschen lächerlich (kann das ziemlich gut ausschließen!). – Damon