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?
Respostas:
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 ++)
fonte
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.
fonte
Parece bom!
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.
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.
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.
fonte
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:
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.
fonte
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.
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.
fonte
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.
fonte