Ich verteile eine gemeinsam genutzte Bibliothek (C ++) und ein Python-Modul, das diese Bibliothek verwendet. Ich baue eine modifizierte Version der Bullet Physics Library (als CMake Subprojekt). Ich verwende nur Bullet-Klassen und Funktionen in einer Datei - bullet_interface.cpp - und alle Bullet-Sachen sind in "namespace {...}" versteckt.
Das Problem besteht darin, dass einige andere Bibliotheken Bullet als Systemabhängigkeit und Link zur Systemversion von Bullet benötigen. In der Tat exportiert eine der Abhängigkeiten meiner Bibliothek (libopenrave) Bullet-Symbole. (Genauer gesagt lädt es manchmal dynamisch ein Plugin, das Bullet-Symbole exportiert).
Ich frage mich, ob es eine Möglichkeit gibt, meine Bibliothek so zu erstellen, dass bullet_interface.cpp die korrekten Bullet-Funktionen verwendet, aber dann macht meine Bibliothek keines der Bullet-Symbole sichtbar. Ich kann das System-Bullet nicht verwenden, weil ich Änderungen am Quellcode vornehmen musste. Eine hacky Lösung wäre, alle Bullet-Funktionen und -Klassen durch Suchen und Ersetzen umzubenennen (fast alle enthalten die Zeichenfolge "bt"). Gibt es einen besseren Weg?
Dies ist ein bisschen umständlich, um das zu erreichen, was Sie wollen, aber es ist besser als Suchen und Ersetzen im Bullet-Code.
Sie können versuchen, Symbole in der Aufzählungsbibliothek mit dem Dienstprogramm objcopy
wie folgt voranzustellen:
Dies sollte auch mit einer dynamischen Bibliothek funktionieren, aber Sie müssen es versuchen. Einzelheiten finden Sie diese Antwort .
Tags und Links c++ shared-libraries visibility name-clash