Pergunta

Eu estou olhando para ter duas versões do IMPULSO compilados em um projeto ao mesmo tempo. Idealmente, devem ser utilizável ao longo destas linhas:

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);
Foi útil?

Solução

Eu li (bem digitalizados) através do lista de desenvolvimento discussão . Não há nenhuma solução fácil. Para resumir:

  1. arquivos de cabeçalho envolvimento em uma declaração de namespace

    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>
    }
    
    • Requer modificar arquivos de origem
    • não permite a ambas as versões a serem incluídos na mesma unidade de tradução, devido ao fato de que as macros não respeitam namespaces.
  2. A definição de impulso antes de incluir cabeçalhos

    #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
    
    • Arquivos de origem pode simplesmente ser compilado com -Dboost=boost_1_36_0
    • Ainda não aborda conflitos macro em uma única unidade de tradução.
    • Algumas inclusões arquivo de cabeçalho interno pode ser confuso, uma vez que este tipo de coisa acontece.

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

      Mas pode ser fácil o suficiente para trabalho em torno desses casos.

  3. Modificar toda a biblioteca de impulso para substituir namespace boost {..} com namespace boost_1_36_0 {...} e, em seguida, fornecendo um alias de namespace. Substitua todas as macros BOOST_XYZ e seus usos com macros BOOST_1_36_0_XYZ.
    • Isto provavelmente trabalho se você estivesse disposto a colocar o esforço.

Outras dicas

Usando bcp pode instalar boost biblioteca para um local específico e pode substituir todos 'boost namespace' em seu código para um alias de costume. Assumindo o nosso apelido é 'boost_1_36_0' all 'namespace impulso' blocos de código vai começar com 'boost_1_36_0'. Algo como

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

, mas verifique a documentação no link de si mesmo, porque eu não tenho certeza se é Syntaxis jurídica.

@ Josh: Embora concorde com o tremor, eu ainda acredito que este é o melhor curso de ação. Caso contrário, os problemas que ligam são uma certeza. Eu tive a situação antes de onde eu tive que cortar as bibliotecas compiladas usando objcopy para evitar conflitos de definição. Foi um pesadelo por razões plataforma de interoperabilidade porque o nome mangling funciona de forma muito diferente, mesmo em diferentes versões dos mesmos compiladores (no meu caso, GCC).

Você vai ter um mundo de vinculação problemas porque os nomes mutilados será diferente. E sim, eu vejo que você sabia disso, mas parece que vai ser um problema todo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top