2013-03-20 13 views
5

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?

+2

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

+0

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

Antwort

1

-Konfiguration (Builder.o): In Funktion Builder::Create() const': Builder.cpp:123: undefined reference to Fabrik :: Instanz()‘

Da Sie sich vergewissert haben, dass Factory::Instance() in Factory.o definiert ist, und da Sie sind offensichtlich Mit Archiv-Bibliotheken, sagt meine Kristallkugel, dass was auch immer Bibliothek enthält Factory.o ist auf der Befehlszeile vorConfiguration.a, während es nach sein sollte.

Die Reihenfolge der Archivbibliotheken in der Befehlszeile matters.

Verwandte Themen