2008-09-23 10 views
10

Ich bin auf der Suche nach zwei Versionen von BOOST zur gleichen Zeit in einem Projekt zusammengestellt. Idealerweise sollten sie in folgenden Bereichen verwendbar sein:Wie kann ich BOOST in einem separaten Namespace umbrechen?

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); 
+0

Ich bin neugierig, warum Sie das tun möchten. – Ferruccio

+0

Es war für den Übergang in die neuere Bibliothek Version während der Arbeit durch einige Inkompatibilitäten. Nichts dauerhaft. – Eclipse

+0

@Eclipse: Wenn Sie in Ihren Schnittstellen keine Boost-Typen anzeigen, können Sie die ELF-Sichtbarkeitsattribute verwenden und alles ausblenden, das nicht die öffentliche Schnittstelle ist. – wilx

Antwort

10

Ich lese (gut gescannt) durch die development list discussion. Es gibt keine einfache Lösung. Fazit:

  1. Wrapping-Header-Dateien in einem 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> 
    } 
    
    • Modifizieren Erfordert Quelldateien
    • Nicht für beide Versionen erlauben, in derselben Übersetzungseinheit enthalten sein, aufgrund der Tatsache, dass Makros Namespaces nicht respektieren.
  2. boost definieren, bevor 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 
    
    • Quelldateien können einfach mit -Dboost=boost_1_36_0
    • kompiliert werden noch nicht Makro Konflikte beziehen, die in einer einzigen Übersetzungseinheit.
    • Einige interne Header-Datei Einschlüsse können durcheinander gebracht werden, da so etwas passiert.

      #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 gesamte Auftrieb Bibliothek namespace boost {..} mit namespace boost_1_36_0 {...} zu ersetzen und dann einen Namespace alias bereitstellt. Ersetzen Sie alle BOOST_XYZ Makros und ihre Verwendung durch BOOST_1_36_0_XYZ Makros.
    • Dies würde wahrscheinlich funktionieren, wenn Sie bereit waren, in die Anstrengung zu investieren.
+0

Wenn Sie die Header ändern, können Sie möglicherweise Makrokonflikte mit etwas wie 's/BOOST_/BOOST_1_36_0_/g' vermeiden. Könnte sein. –

+0

Ich aktualisiert, um Ihren Vorschlag zu beachten. – Eclipse

0

Sie werden eine Welt der Probleme beim Verknüpfen haben, weil die Namen der verschiedenen Namen unterschiedlich sein werden. Und ja, ich sehe, dass du das gewusst hast, aber es scheint, dass es überall Ärger geben wird.

+0

Das wäre der Punkt. Ich würde alle Regex-Quelldateien im boostv1-Verzeichnis auch mit Namespace-Direktiven umhüllen. – Eclipse

+0

Siehe Daniels Punkt, die Makros werden Killer sein –

1

@Josh: Während ich mit dem Zittern einverstanden bin, glaube ich immer noch, dass dies der bessere Weg ist. Andernfalls sind Verknüpfungsschwierigkeiten eine Gewissheit. Ich hatte die Situation zuvor, wo ich die kompilierten Bibliotheken mit objcopy hacken musste, um Definitionskonflikte zu vermeiden. Es war ein Albtraum aus Gründen der Plattforminteroperabilität, weil der Name Mangling selbst in verschiedenen Versionen desselben Compilers (in meinem Fall GCC) sehr unterschiedlich funktioniert.

4

Mit bcp kann Boost-Bibliothek an einen bestimmten Ort installieren und kann alle ‚Namensraum boost‘ in ihrem Code zu einem benutzerdefinierten Alias ​​ersetzen. Unter der Annahme, dass unser Alias ​​'boost_1_36_0' ist, werden alle 'Namespace Boost' Code Blöcke mit 'boost_1_36_0' beginnen. So etwas wie

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install 

, aber überprüfen Sie die Dokumentation in den Link selbst, weil ich nicht sicher bin, ob es legal Syntaxis ist.

Verwandte Themen