Usando diferentes compiladores C ++ e versões de idioma ao desenvolver um único executável

15

Nossa empresa comprará um grande e muito complexo código-fonte para comunicações via satélite.

Ele está codificado em C ++ e nós codificaremos adições a ele, também em C ++, vinculando nosso código com o código comprado em uma única unidade executável.

  • É necessário que usemos o mesmo compilador e a mesma versão do compilador que foi usada para desenvolver o código comprado?

  • É necessário que usemos a mesma versão do C ++ que o código comprado? Se não estiver usando 2014, nós _might _ queremos usar alguns recursos dele, mas não se houver algum problema com a mistura de versões diferentes.

Em teoria, é claro, não deve importar, especialmente a versão da linguagem, mas é concebível que versões diferentes do compilador gerem código objeto diferente, levando potencialmente a diferenças de tempo, etc.

De que devemos estar cientes?

    
por Mawg 16.02.2017 / 16:26
fonte

6 respostas

9

Is it necessary that we use the same compiler and same compiler version as was used to develop the purchased code?

Depende.

Os compiladores geram o código que segmenta uma ABI. Alguns estão usando uma ABI comum (por exemplo, se não me engano, tanto clang ++ e g ++ target para chamado Itanium ABI) e você deve - pode haver bugs impedindo que você faça isso - ser capaz de usar o código de objeto a partir de ambos em um mesmo programa (supondo, claro, que você está usando versões que visam a mesma versão da ABI). O mesmo é verdade entre a versão do compilador: alguns prestam mais atenção para manter a mesma ABI entre a versão do que outra. Obviamente, todos eles precisam de alguma mudança de ABI, e eles podem ser forçados a fazê-lo de uma maneira não compatível. E, obviamente, algumas configurações, como a escolha de um padrão de linguagem, podem influenciar a escolha da ABI.

Depois, há a questão da biblioteca padrão. Os próprios compiladores (ou versões diferentes do mesmo compilador) podem usar a mesma ABI, e ainda assim sua biblioteca padrão pode ser incompatível (e alguns compiladores como o clang ++ podem ser utilizáveis com várias bibliotecas padrão). Ser capaz de fazer funcionar pode depender do que é usado na interface.

Em outras palavras, você tem que cavar e encontrar as informações para o caso específico em que você está. Como ponto de partida e um exemplo de que tipo de informação você deve procurar, aqui é a informação fornecida pelo libstdc ++ (a biblioteca usada pelo g ++ e em alguma configuração pelo clang ++)

    
por 16.02.2017 / 17:52
fonte
8

Is it necessary that we use the same compiler and same compiler version as was used to develop the purchased code? Is it necessary that we use the same version of C++ as the purchased code?

Esta não é principalmente uma questão técnica. É uma questão legal sobre o que você escreve em seu contrato. Certifique-se de que o fornecedor do software forneça uma versão garantida por ele para ser utilizável em seu ambiente. Caso contrário, sempre haverá um certo risco de ter problemas com um compilador, uma versão do compilador ou uma versão de idioma diferente.

Isso é especialmente importante quando você compra o componente ou partes dele como fonte fechada. Mesmo que seu fornecedor garanta que você pode usar o componente com seu ambiente de compilador atual, ele garante que ele fornecerá atualizações se você quiser mudar para uma versão de compilador mais nova no futuro? Se você não tiver acesso ao código-fonte completo, provavelmente não terá muita sorte em tentar solucionar sozinho os problemas de compatibilidade. É por isso que você não deve apenas comprar o software, mas também pensar em um contrato de manutenção de longo prazo com seu fornecedor.

    
por 16.02.2017 / 19:43
fonte
4

Our company will purchase a large and very complex piece of source code for satellite communications. It is coded in C++ and we will code additions to it, also in C++, linking our code with the purchased code into a single executable unit.

Parece bom!

Is it necessary that we use the same compiler and same compiler version as was used to develop the purchased code?

Falando em geral, não, não é necessário. O propósito do C ++ é agir como uma abstração sobre esses tipos de coisas, então um programa C ++ bem escrito irá compilar tão bem no seu toolchain quanto no programa original do autor, e o programa resultante terá o mesmo resultado. O desempenho pode variar, porque diferentes compiladores são bons em coisas diferentes, mas o comportamento fundamental do programa não deve mudar.

No entanto, softwares mal escritos podem depender de comportamento específico da implementação ou mesmo de um comportamento indefinido. Pode fazer suposições sobre os tipos internos, ou sobre o endianness da plataforma. Até mesmo softwares bem escritos podem não ter outra opção a não ser confiar em extensões não padrão que não estão disponíveis no conjunto de ferramentas escolhido, ou podem fazê-lo porque simplesmente não há necessidade de gastar tempo adicionando uma camada de portabilidade durante o período de duração. o projeto original.

Por fim, você precisará perguntar ao autor / fornecedor para que o código-fonte foi escrito. Se eles alegarem que é especificamente escrito contra, digamos, o Visual Studio 2015 e requer recursos da API do Windows, você provavelmente deve ficar com isso. Mas se eles afirmam que é portátil, C ++ padrão, então use o compilador que você gosta. Verifique se o contrato de compra inclui um acordo de suporte para que você possa obter ajuda gratuita quando o fornecedor estiver mentindo.

Is it necessary that we use the same version of C++ as the purchased code? If it is not using 2014, we might want to use some features of it, but not if there might be some problems with mixing different versions.

Provavelmente. Talvez.

O C ++ 03 é compatível com a maioria, portanto, se o código for C ++ 03, é improvável que você tenha um problema. (Embora alguns ajustes possam ser necessários.)

Mas os recursos introduzidos em C ++ 11 e C ++ 14 não são compatíveis com versões anteriores, portanto, se o fornecedor usasse, digamos, lambdas de C ++ 11, e você tentasse compilar seu código em um compilador C ++ 03, isso simplesmente não funcionará.

In theory, of course, it ought not to matter, especially the language version, but it is conceivable that different versions of the compiler will generate different object code, potentially leading to timing differences, etc.

Absolutamente. Se o código depende tanto de uma implementação específica para obter os resultados esperados, cabe ao fornecedor ser responsável e informá-lo sobre isso. Como vivemos no mundo real, recomendo ser diligente e perguntar a eles primeiro.

E eu irei ecoar o que os outros disseram: garantir que você tenha algum tipo de recurso de apoio, de modo que, se deturparem qualquer uma das respostas a essas perguntas (intencionalmente ou não), você não acabe assumindo o custo resultante .

    
por 16.02.2017 / 21:56
fonte
2

Você não vincula código, você vincula arquivos de objetos compilados.

Nesse caso, sim, usar compiladores C ++ diferentes (ou até mesmo configurações como compilações de depuração / release) ou versões diferentes deles ou bibliotecas padrão diferentes (versões de) ao criar partes que interagirão em um nível binário é altamente provável para quebrar o aplicativo se as partes se comunicarem entre si usando mais de APIs C.

Recursos como contêineres ou exceções fornecem a mesma interface, mas, em um nível binário, podem ser implementados de muitas maneiras diferentes e incompatíveis.

No entanto, usar um compilador diferente para compilar todo o código é um problema diferente. Perguntas a considerar:

  • Qual plataforma / arquitetura o código tem como alvo?
  • Para qual padrão foi escrito?
  • Ele usa algum recurso de compilador não padrão?
  • O código contém suposições específicas de plataforma codificadas (como sempre considerando que os ponteiros ocupam 2 bytes)?

Existe também o risco de que o código contenha partes que resultem em comportamento indefinido. Estes podem parecer estar funcionando bem ao usar um compilador, mas falham de maneiras misteriosas ao usar um compilador diferente.

    
por 16.02.2017 / 16:57
fonte
1

Is it necessary that we use the same compiler and same compiler version as was used to develop the purchased code?

Bem, o compilador de comutação pode causar alguns problemas; atualmente na minha empresa, usamos Clang e MSVC, e temos erro em um compilador que o outro não marca como tal.

Is it necessary that we use the same version of C++ as the purchased code? If it is not using 2014, we might want to use some features of it, but not if there might be some problems with mixing different versions.

Não é necessário, mas é claro que o compilador deve suportar a versão C ++ que você deseja usar. C ++ garante compatibilidade retro a partir de todas as versões.

    
por 16.02.2017 / 16:36
fonte
1

Um grande problema ao alterar compiladores é um comportamento indefinido: se o código que você recebe invocar um comportamento indefinido, então tudo é possível - incluindo que o código funcione bem e passe em todos os testes ao usar seu compilador e dê muito errado seu compilador.

Isso é possível, mas, nessa situação, você também pode ter problemas se alterar os níveis de otimização, usar a próxima versão do mesmo compilador e assim por diante. Então nada que você possa evitar.

    
por 16.02.2017 / 18:58
fonte

Tags