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

15

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

É codificado em C ++ e codificaremos adições, também em C ++, vinculando nosso código ao código comprado em uma única unidade executável.

  • É necessário usar o mesmo compilador e a mesma versão do compilador usados ​​para desenvolver o código adquirido?

  • É necessário usar a mesma versão do C ++ que o código adquirido? Se não estiver usando 2014, talvez desejemos usar alguns recursos, mas não se houver problemas com a mistura de versões diferentes.

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

Do que devemos estar cientes?

Mawg diz que restabelece Monica
fonte
7
Espero que você não apenas esteja comprando o código-fonte, mas também suporte (por pessoas qualificadas).
Basile Starynkevitch 16/02
1
De fato, nós somos. E, é claro, eu também fiz essa pergunta ao fornecedor. Mas pensei que seria um bom ponto de discussão aqui e uma boa referência futura para outros no futuro.
Mawg diz que restabelece Monica
2
Você está falando sobre compilar o código de terceiros usando um compilador não suportado ou está falando sobre compilar partes diferentes do código usando compiladores diferentes (por exemplo, usar o suportado para o código que está comprando e um mais novo para o seu próprio código e, em seguida, vinculá-los)? Ou está decidindo entre essas partes da questão?
Jpmc26 17/02
3
Até a versão do idioma pode importar, consulte gcc.gnu.org/wiki/Cxx11AbiCompatibility para obter uma lista das versões (mais antigas) do compilador e pequenas diferenças na ABI. Em outras palavras: o mesmo compilador, mas diferentes configurações de linguagem c ++ (c ++ 03 s c ++ 11) podem ser importantes.
André
2
E com o MSVC, geralmente não é seguro passar objetos de biblioteca padrão através dos limites (dinâmicos) da biblioteca. Veja, por exemplo, stackoverflow.com/q/5661738/417197
André

Respostas:

9

É necessário usar o mesmo compilador e a mesma versão do compilador usados ​​para desenvolver o código adquirido?

Depende.

Compiladores geram código direcionado a uma ABI. Alguns estão usando uma ABI comum (por exemplo, se não me engano, ambos clang ++ e g ++ são chamados Itanium ABI) e você deve - pode haver erros que o impedem de fazer isso - ser capaz de usar o código do objeto de ambos em um mesmo programa (assumindo, é claro, que você esteja usando versões direcionadas à mesma versão da ABI). O mesmo se aplica à versão do compilador: alguns prestam mais atenção para manter o mesmo ABI entre versões do que outros. Obviamente, todos eles precisam de alguma alteração na ABI e podem ser forçados a fazê-lo de maneira não compatível. E, obviamente, algumas configurações como a escolha de um padrão de idioma podem ter influência na escolha da ABI.

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

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

AProgrammer
fonte
10
ABI = Interface Binária do Aplicativo
Simon B
2
Esta resposta é sobre a compatibilidade do código do objeto. O OP está comprando o código fonte .
Lightness Races com Monica
7
@LightnessRacesinOrbit A pergunta fala sobre o uso de diferentes compiladores para gerar um único executável. Não é um grande salto pensar: "Eles significam compilar o código de terceiros com um compilador (provavelmente um 'suportado') e seu próprio código com um compilador diferente (provavelmente um mais novo)". (Isso é definitivamente o que eu entendo que o OP está perguntando; se você o lê de forma diferente, pode pedir ao OP que esclareça.) Nessa possibilidade ou em outras semelhantes, a compatibilidade do código de objeto parece altamente relevante.
Jpmc26
1
@ jpmc26: "Definitivamente, é isso que eu entendo que o OP está perguntando; se você o lê de maneira diferente, pode pedir ao OP que esclareça." A OP declarou claramente que sua empresa "comprará um código-fonte grande e muito complexo". Além disso, com declarações como "é concebível que versões diferentes do compilador gerem código de objeto diferente, potencialmente levando a diferenças de tempo", eles estão perguntando sobre quais alterações quando compilam o código comprado com diferentes cadeias de ferramentas, não apenas as suas. Eu não acho que haja muito espaço para interpretação lá!
Lightness Races com Monica
8

É necessário usar o mesmo compilador e a mesma versão do compilador usados ​​para desenvolver o código adquirido? É necessário usar a mesma versão do C ++ que o código adquirido?

Esta não é principalmente uma questão técnica. É uma pergunta legal sobre o que você escreve no seu contrato. Verifique se o fornecedor do software fornece uma versão garantida por ele para ser utilizável em seu ambiente. Caso contrário, sempre haverá um certo risco de ocorrer problemas com um compilador, versão do compilador ou 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ê possa usar o componente com seu ambiente atual de compilador, ele garante que ele fornecerá atualizações se você desejar mudar para uma versão mais recente do compilador no futuro? Se você não tiver acesso ao código fonte completo, provavelmente não terá muita sorte em tentar resolver qualquer problema de compatibilidade sozinho. É 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.

Doc Brown
fonte
Este é realmente um bom conselho!
T. Sar - Restabelece Monica
É de fato, mas, infelizmente, tarde demais. Como observei no comentário de Basile, também fiz essa pergunta ao fornecedor. Mas eu pensei que seria um bom ponto de discussão aqui e uma boa referência futura para outros no futuro
Mawg diz que restabelece Monica
4

Nossa empresa comprará um código-fonte grande e muito complexo para comunicações via satélite. É codificado em C ++ e codificaremos adições, também em C ++, vinculando nosso código ao código comprado em uma única unidade executável.

Parece bom!

É necessário usar o mesmo compilador e a mesma versão do compilador usados ​​para desenvolver o código adquirido?

Falando em geral, não, não é necessário. O objetivo do C ++ é atuar como uma abstração sobre esses tipos de coisas, para que um programa C ++ bem escrito seja compilado tão bem na sua cadeia de ferramentas quanto no autor original, 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, o software mal escrito pode depender de um comportamento específico da implementação ou mesmo de um comportamento indefinido. Pode fazer suposições sobre os tipos internos ou sobre a capacidade de endereçamento da plataforma. Mesmo software bem escrito pode não ter escolha, a não ser confiar em extensões não padrão que não estão disponíveis na sua cadeia de ferramentas escolhida, ou pode fazê-lo porque simplesmente não havia necessidade de gastar tempo adicionando uma camada de portabilidade durante o período de o projeto original.

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

É necessário usar a mesma versão do C ++ que o código adquirido? Se ele não estiver usando 2014, pode querer usar algumas características do mesmo, mas não se pode haver alguns problemas com mistura de diferentes versões.

Provavelmente. Talvez.

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

Porém, os recursos introduzidos no C ++ 11 e no C ++ 14 não são compatíveis com versões anteriores, portanto, se o fornecedor usou, digamos, C ++ 11 lambdas, e você tenta criar o código em um compilador C ++ 03, que acabou de ganhar funcione.

Em teoria, é claro, isso não deve importar, especialmente a versão da linguagem, mas é concebível que versões diferentes do compilador gerem código de objeto diferente, levando potencialmente a diferenças de tempo, 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 disso. Como vivemos no mundo real, recomendo ser diligente e pedir a eles primeiro.

E ecoarei o que os outros disseram: garanta que você tenha algum tipo de recurso de apoio, para que, se eles deturpassem alguma das respostas a essas perguntas (intencionalmente ou não), você não acabasse assumindo o custo resultante.

Corridas de leveza com Monica
fonte
Vale ressaltar: o vínculo não é totalmente coberto pelas especificações C ++. Embora o código possa ser compilado em vários compiladores em conformidade, não é garantido que você possa apenas vinculá-los e fazê-lo funcionar.
Cort Ammon - Restabelece Monica
1
@ CortAmmon: Você deve / deve compilar todos os componentes da distribuição resultante com cadeias de ferramentas que compartilhem uma ABI. Os padrões ABI estão fora do escopo do C ++. Eu não acho que o OP esteja perguntando sobre misturar cadeias de ferramentas de qualquer maneira.
Lightness Races com Monica
2

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

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

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

Usar um compilador diferente para compilar o código inteiro é um problema diferente. Questões a considerar:

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

Também existe o risco de o código conter partes que resultam em comportamento indefinido. Eles podem parecer estar funcionando bem ao usar um compilador, mas falham de maneiras misteriosas ao usar outro.

D. Jurcau
fonte
O OP está criando o código, não o fornecedor. O OP está perguntando como a mudança no ambiente de construção (consulte o fornecedor) pode afetar a geração de código, dada a mesma base de código.
Lightness Races com Monica
1

É necessário usar o mesmo compilador e a mesma versão do compilador usados ​​para desenvolver o código adquirido?

Bem, alternar o compilador pode levar a alguns problemas; atualmente em minha empresa, usamos Clang e MSVC, e temos um erro em um compilador que o outro não marca como tal.

É necessário usar a mesma versão do C ++ que o código adquirido? Se ele não estiver usando 2014, pode querer usar algumas características do mesmo, mas não se pode haver alguns problemas com mistura de diferentes versões.

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

LaboPie
fonte
Praticamente meu pensamento. E as versões do compilador - se eles usam a versão x do GCC e a mais recente é x + 2, por exemplo?
Mawg diz que restabelece Monica
1
Bem, se eles usarem uma versão mais antiga do compilador que você deseja usar, não haverá problema, porque não existem itens obsoletos, o problema poderá aumentar se eles estiverem usando uma versão mais recente do seu compilador.
LaboPie
Mas como? Eu também prefiro não. Mas você conhece algum tipo de problema que poderia ocorrer?
Mawg diz que restabelece Monica em 16/02
Mas você conhece algum tipo de problema que poderia ocorrer? Se eles estavam usando alguma função que nosso compilador não suportará, o código simplesmente não será compilado.
LaboPie 16/02
1
Um pequeno apêndice, é claro que o problema se tornaria maior se o compilador usado no outro escritório não fosse o principal. Por exemplo, um compilador de console antigo ou algo que funcione com um subconjunto de linguagem.
LaboPie 16/02
1

Um grande problema ao alterar compiladores é um comportamento indefinido: se o código que você recebe chama um comportamento indefinido, tudo é possível - incluindo que o código funcione bem e passe todos os testes ao usar o compilador, e comete um erro terrível no 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.

gnasher729
fonte
Esse é um bom argumento para usar o lint e talvez o valgrind .