Domanda

Sto cercando di avere due versioni di BOOST compilate contemporaneamente in un progetto. Idealmente dovrebbero essere utilizzabili in questo senso:

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);
È stato utile?

Soluzione

Ho letto (ben scannerizzato) la discussione dell'elenco di sviluppo . Non esiste una soluzione facile. Per riassumere:

  1. Avvolgimento dei file di intestazione in una dichiarazione dello spazio dei nomi

    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>
    }
    
    • Richiede la modifica dei file di origine
    • Non consente l'inclusione di entrambe le versioni nella stessa unità di traduzione, in quanto le macro non rispettano gli spazi dei nomi.
  2. Definizione di boost prima di includere le intestazioni

    #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
    
    • I file di origine possono essere semplicemente compilati con -Dboost=boost_1_36_0
    • Non risolve ancora i conflitti di macro in una singola unità di traduzione.
    • Alcune inclusioni di file di intestazione interne potrebbero essere incasinate, poiché questo genere di cose accade.

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      

      Ma potrebbe essere abbastanza facile aggirare quei casi.

  3. Modifica dell'intera libreria boost per sostituire boost spazio dei nomi {..} con boostpace spazio dei nomi_1_36_0 {...} e quindi fornire un alias dello spazio dei nomi. Sostituisci tutte le macro BOOST_XYZ e i loro usi con le macro BOOST_1_36_0_XYZ .
    • Probabilmente funzionerebbe se tu fossi disposto a impegnarti.

Altri suggerimenti

È possibile installare bcp incrementa la libreria in una posizione specifica e può sostituire tutto "boost dello spazio dei nomi" nel loro codice con un alias personalizzato. Supponendo che il nostro alias sia "boost_1_36_0", tutti i blocchi di codice "namespace boost" inizieranno con "boost_1_36_0". Qualcosa come

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

, ma controlla tu stesso la documentazione nel link perché non sono sicuro che si tratti di sintassi legale.

@Josh: Mentre sono d'accordo con i brividi, credo ancora che questa sia la migliore linea d'azione. Altrimenti, i problemi di collegamento sono una certezza. Ho avuto la situazione in cui dovevo hackerare le librerie compilate usando objcopy per evitare conflitti di definizione. È stato un incubo per motivi di interoperabilità della piattaforma perché il nome mangling funziona in modo molto diverso anche nelle diverse versioni degli stessi compilatori (nel mio caso, GCC).

Avrai un mondo di problemi nel collegamento perché i nomi alterati saranno diversi. E sì, vedo che lo sapevi, ma sembra che ci saranno problemi ovunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top