2009-07-13 6 views
6

Ich arbeite mit OpenCV und möchte die gesamte Bibliothek in einen eigenen Namensraum stellen. Ich habe mich schon ein wenig umgeschaut, aber keine Antwort gefunden ...Können Sie eine Bibliothek in einen Namespace einfügen?

Können Sie dies tun, ohne den Bibliotheks-Quellcode zu ändern? Wenn dann wie?

+0

Ich habe gerade die OpenCV-Website angeschaut. Es sieht so aus, als ob allen Funktionen ein "cv" vorangestellt ist. Während Namespaces eine bessere Lösung sind, frage ich mich, haben Sie tatsächliche Symbolkollisionen? –

+0

Ich habe keine tatsächlichen Kollisionen, es ist nur um die Dinge organisiert zu halten, da ich Wrapper von einigen openCV Datenstrukturen mache und sie in den gleichen Namespace legen möchte. –

Antwort

7

Grundsätzlich nicht. Sie könnten versuchen, dies zu tun, indem Sie Wrapper und Makros schreiben, aber es würde wahrscheinlich nicht funktionieren. Wenn Sie dies wirklich tun müssen, besteht ein besserer Ansatz darin, die Bibliothek zu verzweigen und die erforderlichen Namespace-Zusätze hinzuzufügen. Natürlich müsstest du das wirklich tun, um diesen Ansatz zu verfolgen, und ich vermute, dass du es nicht tust.

+0

Verdammt ......... –

+0

Akzeptiert, weil es gerade auf den Punkt –

+0

Und der weiseste Rat sicherlich war? –

4

Sie könnten im Prinzip ein Programm schreiben, das die Symbolexporttabellen der Bibliothek analysiert und die Namen der Symbole dort ändert. Sie müssten natürlich noch die Kopfzeilen ändern.

Das sagte, es wäre viel einfacher, ein einfaches Skript zu schreiben, um Namespace-Tags hinzuzufügen und die Bibliothek neu zu kompilieren.

+8

Ich habe das einmal getan, um hässliche Namenskonflikte in einer Drittanbieter-Bibliothek zu umgehen. Mein starker Rat ist: ** nicht **! Es ist schrecklich. –

+0

Danke Konrad vom Rat! –

+0

oder Sie könnten einfach objcopy verwenden, die die Fähigkeit hat, Symbole zu ändern: -P. –

2

Sie könnten eine Wrapper-Headerdatei bereitstellen, die dieselbe Schnittstelle in einem Namespace deklariert. Fügen Sie in Ihrer Wrapperquelldatei die Header für die Bibliothek hinzu und rufen Sie diese Bibliothek auf. Keine Quelle außerhalb Ihrer Quelle muss über die Symbole der Bibliothek Bescheid wissen. Wenn Sie wirklich vorsichtig sein wollen, können Sie das alles in eine dynamisch geladene Bibliothek einfügen.

Es war sehr üblich, dies mit COM zu tun, um die Linker-Abhängigkeiten einiger Bibliotheken zu verbergen. Kann nicht sehen, warum Sie es nicht mit C++ machen können.

3

Die allgemeine Antwort ist, dass Sie nicht können, aber es gibt ein paar Tricks, die Sie tun können.

Zum Beispiel objcopy von binutils hat die Fähigkeit, ein Objekt zu kopieren, setzen, aber einen Präfix zu jedem Symbol unter Verwendung der prefix-Symbole Flagge. Dinge voranzustellen ist oft der Namensraum des armen Mannes und ist ein "ok" Weg Konflikte zu vermeiden.

Verwendung ist ziemlich einfach, so etwas wie diese:

objcopy --prefix-symbols "__mylib_" object.o new_object.o 

HINWEIS: ja, es funktioniert mit .so zu Dateien.

HINWEIS 2: Dies wird C++ Namen Mangling vollständig brechen, also versuchen Sie dies nur auf eine Bibliothek mit einem C-Stil-API. Da Sie davon sprechen, einen Namespace hinzuzufügen, in dem es keinen gibt, gehe ich davon aus, dass dies der Fall ist.

Verwandte Themen