Wo ist __dso_handle definiert?
Habe ich ein nicht aufgelöstes symbol Fehler beim Versuch, um mein Programm zu kompilieren, beschwert sich, dass Sie es nicht finden können __dso_handle
. Die Bibliothek ist diese Funktion in der Regel definiert?
Folgendes Ergebnis aus nm on libstdc++.so.6
bedeuten, enthält es das?
Ich versucht, Links vor, aber der Fehler immer noch Auftritt.
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
Du musst angemeldet sein, um einen Kommentar abzugeben.
__dso_handle
ist ein "guard" ist dient zum identifizieren von dynamic shared objects während der globalen Zerstörung.Realistisch, sollten Sie hier aufhören zu Lesen. Wenn Sie versuchen, zu besiegen, die Objekt-Identifikation von messing mit
__dso_handle
sowas ist wahrscheinlich sehr falsch.Jedoch, da Sie fragte, wo es definiert ist: die Antwort ist Komplex. Auf der Oberfläche den Ort der definition (für GCC), verwenden Sie
iostream
in einer C++ - Datei und nach, dass zu tunextern int __dso_handle;
. Das sollte Oberfläche die Position der Deklaration durch einen Typ-Konflikt (siehe dieser forum thread für eine Quelle).Manchmal ist es manuell festgelegt.
Manchmal, es definiert ist/geliefert von der "runtime" installiert, der vom compiler (in der Praxis, der CRT ist in der Regel nur ein Haufen von binären header/entry-point-management-code, und einige beenden Wachen/Handler). In GCC (nicht sicher, ob andere Compiler unterstützen dies; wenn dem so ist, werden Sie in Ihren Quellen):
__dso_handle
Ersatz - /tracker-Beispiel 1__dso_handle
Ersatz - /tracker-Beispiel 2Oft, es ist definiert in der stdlib:
Weiter Lesen:
__dso_handle
nicht erreichbar in einigen CompilernIch lief in dieses problem. Hier sind die Bedingungen, die scheinen zuverlässig zu generieren, die sich die Mühe:
-nostdlib
(typische kleine embedded-Szenario).std::vector
. Dies war bisherstd::array
statisch zugewiesen, ohne irgendwelche Probleme. Offenbar nicht allestd::
statisch zugeordneten Objekte wird das problem verursachen.Wenn dies Ihr Fall ist, dann verwenden Sie nur fügen Sie der Befehlszeile-option zu Ihrem Compiler - /link-Befehlszeile:
-fno-use-cxa-atexit
Ist hier ein sehr guter link zu dem __dso_handle-Nutzung als 'Griff, um dynamic shared object'.
Es scheint ein Tippfehler in der Seite, aber ich habe keine Ahnung, wer zu Kontaktieren, um zu bestätigen:
Nach dem aufrufen der Objekte Konstruktor Destruktor GCC automatisch die Funktion aufruft ...Ich denke, dies Lesen sollte, "wenn alle Destruktoren aufgerufen worden GCC ruft die Funktion" ...
Einen Weg, dies zu bestätigen, wäre die Umsetzung der
__cxa_atexit
Funktion wie erwähnt, und dann Schritt das Programm und sehen, wo es aufgerufen wird. Ich werde versuchen, dass einer von diesen Tagen, aber nicht jetzt.