Beschreibung :
a. Die Klasse X enthält ein statisches privates Datenmitglied ptr und ein statisches öffentliches Funktionsmitglied getptr()/setptr().
In X.cpp wird der ptr auf NULL gesetzt.
b. libXYZ.so (gemeinsames Objekt) enthält das Objekt der Klasse X (d.h. libXYZ.so enthält X.o).
c. libVWX.so (gemeinsames Objekt) enthält das Objekt der Klasse X (d.h. libVWX.so enthält X.o).
d. Die ausführbare Datei a.exe enthält X.cpp als Teil der Übersetzungseinheiten und ist schließlich mit libXYZ.so und libVWX.so verknüpft
PS:
1. In keiner der Klassen sind Benutzernamensräume beteiligt.
2. Die Bibliotheken und die ausführbare Datei enthalten auch viele andere Klassen.
3. Es wurde kein dlopen() durchgeführt. Alle Bibliotheken werden während der Kompilierungszeit mit den Flags -L und -l gelinkt.
Problemstellung:
-
Beim Kompilieren und Verknüpfen von a.exe mit anderen Bibliotheken (z.B. libXYZ.so und libVWX.so) habe ich einen Linker-Fehler erwartet (Konflikt/mehrmaliges Auftreten desselben Symbols), aber keinen erhalten.
-
Bei der Ausführung des Programms kam es zu einem merkwürdigen Verhalten in SUSE 10 Linux und HP-UX 11 IA64.
Wenn unter Linux der Ausführungsfluss über alle Objekte in verschiedenen Bibliotheken verschoben wurde, wurde der Effekt nur in einer Kopie von X registriert.
In HPUX, wenn die Ausführung Fluss über alle Objekte in verschiedenen Bibliotheken geschoben wurde, wurde der Effekt in 3 verschiedenen Kopien von X (2 gehören zu jeder Bibliothek und 1 für ausführbare) registriert
PS: Ich meine, dass während der Ausführung des Programms der Fluss mehrere Objekte durchlief, die zu a.exe, libXYZ.so und libVWX.so gehören und mit statischen Zeigern interagierten, die zu X gehören.
Frage:
- Ist Expecting linker error nicht korrekt? Da zwei Compiler durch Kompilierung stillschweigend übergeben, Mai gibt es eine Standardregel im Falle dieser Art von Szenario, die ich vermisse. Wenn ja, lassen Sie mich bitte das gleiche wissen.
- Wie entscheidet der Compiler (gcc in Linux und aCC in HPUX), wie viele Kopien von X in der endgültigen ausführbaren Datei verbleiben und wie er sie in solchen Szenarien referenziert.
- Gibt es irgendeine Flagge, die von gcc und ACC unterstützt wird, die die Kompilierung für die Benutzer in dieser Art von Szenarien warnt/anhält?
Vielen Dank für Ihre Hilfe im Voraus.