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);
War es hilfreich?

Lösung

Ich habe gelesen (auch gescannt) durch die Entwicklung Liste Diskussion . Es gibt keine einfache Lösung. Fazit:

  1. 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.
  2. 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.

  3. Ändern der gesamten Boost-Bibliothek namespace boost {..} mit namespace boost_1_36_0 {...} zu ersetzen und dann einen Namespace alias bereitstellt. Ersetzen Sie alle BOOST_XYZ Makros und deren Verwendung mit BOOST_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).

Mangeln

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top