2011-01-04 3 views
1

Ich baue etwas auf HPUX. Code funktioniert in Sun/Linux/AIX.Unzufriedene Symbole in Debug aber nicht Release

Aber auf HPUX klagt sie auf

[sshexec] /usr/ccs/bin/ld: Unsatisfied symbols: 
[sshexec] globalVar (first referenced in blah.o) 

Wieder einmal Code in Release funktioniert aber nicht in Debug. Alles, was sie tut es globalen Variable verwendet in einer anderen Datei definiert

extern globPck globalVar; 

globPck ist Klasse, die eine globalen Sachen cointains.

Ich interessiere mich mehr für Ideen, was der Grund dafür sein könnte, in Release zu arbeiten, aber nicht in Debug.

Ich schaute über .i-Dateien (vorkompilierte Header-Datei mit -E erzeugt) Und es scheint auf die gleiche Weise definiert.

Ich rate etwas, das im Release-Code-Pfad getroffen wird, behebt es, aber ich bin hier zu hören, wenn Sie alle Ideen haben.

Antwort

3

Die erste Sache zu tun, wenn der Linker beschwert, dass etwas nicht definiert ist, ist für sich selbst zu suchen, wo das Ding definiert ist. Wenn Sie es nicht finden können, dann erwarten Sie auch nicht, dass der Linker es findet.

Was Sie gezeigt haben, ist eine Deklaration, keine Definition. Eine Definition hat das Schlüsselwort extern nicht. Es sollte eine Definition in genau einer .cpp Datei in Ihrem Projekt geben, keine Kopfzeile.

Sobald Sie die Definition gefunden haben, können Sie anfangen zu arbeiten, warum der Linker es nicht sieht. Vielleicht ist es nur definiert, wenn bestimmte Symbole vorhanden sind, z. B. DEBUG oder NDEBUG.

Wenn es keine Definition ist, dann vielleicht alle verwendet es während der Freisetzung Zusammenstellung entfernt bekommen (vielleicht, weil alle Verwendungen in assert Aussagen vorkommen, dass der Compiler läßt), so dass die fehlende Definition nicht im Release-Modus bemerkt.

+0

es ist ziemlich seltsam, weil im Freigabemodus dieses Symbol nicht in .o Objekt ist (wenn Sie nm blah.o | grep globalVar tun. Es zeigt nur in Debug und ich sah und nirgends hat es #if DEBUG oder was nicht ... – grobartn

+0

In dieser Situation würde ich eine Plausibilitätsprüfung machen: Absichtlich einen Syntaxfehler neben der Stelle hinzufügen, an der '' globalVar' 'definiert wird. Kompiliere im Freigabemodus und bestätige (durch einen Compilerfehler), dass der Compiler Wenn Sie keinen Fehler erhalten, kompiliert entweder der Compiler nicht die Datei, die Sie dachten, oder Sie müssen Ihre Suche nach dem '# ifdef erweitern, das den Zugriff auf Ihren Code blockiert. –

0

Der HPUX-Compiler liebt es, Konstruktoraufrufe auf globale Klassen zu "optimieren", wenn auf die Klassen nur indirekt über den Hauptausführungspfad zugegriffen wird. Versuchen Sie, einen einfachen printf() mit dem Wert der Variable in Ihrem Hauptthread irgendwo hinzuzufügen und sehen Sie, ob das Problem verschwindet.

+0

Willkommen auf S. Bitte achten Sie auf Interpunktion, damit Ihre Antwort leichter zu lesen und zu verstehen ist. – Tarec

Verwandte Themen