Question

Je souhaite que deux versions de BOOST soient compilées dans un projet en même temps. Idéalement, ils devraient pouvoir être utilisés selon ces principes:

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);
Était-ce utile?

La solution

J'ai lu (avec une bonne numérisation) la discussion sur la liste de développement . Il n'y a pas de solution facile. Pour résumer:

  1. Habillage des fichiers d'en-tête dans une déclaration d'espace de nom

    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>
    }
    
    • Nécessite de modifier les fichiers source
    • Ne permet pas l'inclusion des deux versions dans la même unité de traduction, car les macros ne respectent pas les espaces de noms.
  2. Définition du boost avant l'inclusion des en-têtes

    #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
    
    • Les fichiers sources peuvent simplement être compilés avec -Dboost = boost_1_36_0
    • N'adresse toujours pas les conflits de macros dans une seule unité de traduction.
    • Certaines inclusions de fichiers d'en-tête internes peuvent être faussées, car ce genre de chose se produit.

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

      Mais il peut être assez facile de contourner ces cas.

  3. Modification de l'ensemble de la bibliothèque boost pour remplacer boost d'espace de nom {..} par boost d'espace de nom_1_36_0 {...} , puis fournir un alias d'espace de nom. Remplacez toutes les macros BOOST_XYZ et leurs utilisations par des macros BOOST_1_36_0_XYZ .
    • Cela fonctionnerait probablement si vous étiez prêt à participer à l'effort.

Autres conseils

Utilisation de bcp peut être installé. boost la bibliothèque à un emplacement spécifique et peut remplacer tout "boost d'espace de nom" dans son code par un alias personnalisé. En supposant que notre alias soit 'boost_1_36_0', tous les blocs de code 'espaces de noms boostés' commenceront par 'boost_1_36_0'. Quelque chose comme

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

, mais vérifiez la documentation dans le lien vous-même car je ne suis pas sûr que ce soit une syntaxe légale.

@Josh: Bien que je sois d’accord avec les frissons, je crois toujours que c’est la meilleure façon de procéder. Sinon, les problèmes de liaison sont une certitude. Il m'est déjà arrivé de pirater les bibliothèques compilées à l'aide de objcopy pour éviter les conflits de définitions. C’était un cauchemar pour des raisons d’interopérabilité de plate-forme car le nom mangling fonctionne de manière très différente, même dans des versions différentes des mêmes compilateurs (dans mon cas, GCC).

Vous aurez beaucoup de mal à établir des liens parce que les noms mutilés seront différents. Et oui, je vois que vous le saviez, mais il semble que ce sera un problème tout autour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top