Ich möchte dies mit dem wichtigen Hinweis einleiten, dass Ich bin kein C/C++-Programmierer und wissen sehr gering darüber, wie die Verknüpfung von Bibliotheken in C funktioniert.
Unser Code verwendet libstdc++.so.6 (gcc 3.4, glaube ich). Wir haben Drittanbieter vorkompiliert (geschlossene Quelle) Bibliotheken, die libstdc++.so.5 (gcc 2.etwas oder 3.2, ich glaube) verwenden. Dies ist auf Linux. Wir haben sowohl eine .a- als auch eine .so-Version der Drittanbieter-Bibliothek.
Ist es möglich, unsere Anwendung mit den Bibliotheken von Drittanbietern zu erstellen? Wie? Ist es möglich, unsere App zu erstellen/auszuführen, ohne dass libstdc++.so.5 auf unseren Rechnern installiert ist, wie?
Sollte ich eine wichtige Information vergessen haben, lassen Sie es mich bitte wissen - ich weiß kaum, was bei diesem Zeug relevant ist. Mir ist klar, dass eine vollständige Antwort wahrscheinlich nicht möglich sein wird; ich bin wirklich auf der Suche nach Orientierung und Anleitung. Statischer Link dies, dynamischer Link das, Rebuild das, Prebuild dies und das, Wechsel zu Version x, oder Symlink das Quizdoodle, etc.
Aktualisierung:
Wir haben es mit dlopen
avec RTLD_LOCAL
um die Bibliothek des Drittanbieters vom Rest unserer Anwendung zu isolieren. Dies scheint zu haben meist gearbeitet hat, bleiben jedoch aus unbekannten Gründen große Speicherlecks zurück. Wir vermuten, dass wir beim Aufruf von dlopen
zieht die Bibliothek von Drittanbietern Symbole ein wie malloc
aus der bereits geladenen .so.6, und die Dinge geraten durcheinander.
Aus Jux und Dollerei haben wir versucht, die Drittanbieter-Bibliothek in LD_PRELOAD
und dann unsere Anwendung ausgeführt, und die Speicherlecks scheinen vollständig zu verschwinden.
0 Stimmen
Ich kann mir nicht helfen, aber ich habe das Gefühl, dass Namespaces zur Lösung dieses Problems beitragen könnten. Da der Anbieter seine Bibliothek nicht reparieren will, ist es möglich, dass er seine Sachen in einen zusätzlichen Namespace stellt, wie
namespace 5 {}
. Das heißt, ihre Bibliothek würde die5::malloc
, während für die aktuellen Sachen nur diemalloc
. (Ich weiche einigen Fragen aus, z. B. warum sie diemalloc
in einem C++-Programm).