Wie kann ich BOOST in einem eigenen Namensraum wickeln?
-
02-07-2019 - |
Frage
Ich suche zwei Versionen von BOOST in ein Projekt zur gleichen Zeit zusammengestellt haben. Im Idealfall sollten sie entlang dieser Linien verwendbar sein:
boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);
Lösung
Ich habe gelesen (auch gescannt) durch die Entwicklung Liste Diskussion . Es gibt keine einfache Lösung. Fazit:
-
Wrapping-Header-Dateien in einer Namespace-Deklaration
namespace boost_1_36_0 { #include <boost_1_36_0/boost/regex.hpp> } namespace boost_1_35_0 { #include <boost_1_35_0/boost/shared_ptr.hpp> }
- Benötigt modifizierenden Quelldateien
- Erlaubt keine für beide Versionen in derselben Übersetzungseinheit aufgenommen werden, aufgrund der Tatsache, dass Makros nicht respektieren Namespaces.
-
definiert Schub vor, einschließlich Header
#define boost boost_1_36_0 #include <boost_1_36_0/boost/regex.hpp> #undef boost #define boost boost_1_35_0 #include <boost_1_35_0/boost/shared_ptr.hpp> #undef boost
- Die Quelldateien können einfach mit
-Dboost=boost_1_36_0
kompiliert werden - Still geht nicht auf Makro Konflikte in einer einzigen Übersetzungseinheit.
-
Einige interne Header-Datei Einschlüsse vermasselt werden können, da diese Art der Sache geschieht.
#if defined(SOME_CONDITION) # define HEADER <boost/some/header.hpp> #else # define HEADER <boost/some/other/header.hpp> #endif
Aber es kann leicht genug sein, um diese Fälle zu arbeiten.
- Die Quelldateien können einfach mit
- Ändern der gesamten Boost-Bibliothek
namespace boost {..}
mitnamespace boost_1_36_0 {...}
zu ersetzen und dann einen Namespace alias bereitstellt. Ersetzen Sie alleBOOST_XYZ
Makros und deren Verwendung mitBOOST_1_36_0_XYZ
Makros.- Dies würde wahrscheinlich funktionieren, wenn Sie bereit sind, in die Bemühung zu setzen.
Andere Tipps
Mit bcp können installieren Boost-Bibliothek an einen bestimmten Ort und kann ersetzen all ‚Namensraum boost‘ in ihrem Code zu einem benutzerdefinierten Alias. Unter der Annahme, unsere alias ist ‚boost_1_36_0‘ all ‚Namensraum boost‘ Codeblöcke beginnen mit ‚boost_1_36_0‘. So etwas wie
bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install
, aber überprüfen Sie die Dokumentation in der Verbindung selbst, weil ich nicht sicher bin, ob es legal syntaxis ist.
@ Josh:
Während ich mit dem Schüttelfrost einverstanden ist, glaube ich, noch das die bessere Vorgehensweise ist. Ansonsten sind die Verknüpfung Probleme eine Gewissheit. Ich habe die Situation hat vor, wo ich hatte die kompilierten Bibliotheken objcopy
zu hacken Definition Konflikte zu vermeiden. Es war ein Alptraum für die Interoperabilität von Plattformen Gründe, weil der Namen Werke sehr unterschiedlich, auch in verschiedenen Versionen des gleichen Compiler (in meinem Fall, GCC).
Sie werden eine Welt von Schwierigkeiten haben, die Verknüpfung, da die verstümmelten Namen anders sein wird. Und ja, ich sehe, Sie wusste das, aber es scheint, wie es Schwierigkeiten sein wird, alle um.