Compatibilidade binária do C++ entre versões do Visual Studio

Os conjuntos de ferramentas do compilador Microsoft C++ (MSVC) no Visual Studio 2013 e anteriores não garantem compatibilidade binária entre as versões principais. Não é possível vincular arquivos-objeto, bibliotecas estáticas, bibliotecas dinâmicas e arquivos executáveis criados por diferentes versões desses conjuntos de ferramentas. As ABIs, os formatos de objeto e as bibliotecas de runtime são incompatíveis.

Alteramos esse comportamento no Visual Studio 2015 e versões mais recentes. As bibliotecas de runtime e os aplicativos compilados por qualquer uma dessas versões do compilador são compatíveis com binário. Isso se reflete no número principal do conjunto de ferramentas C++, que começa com 14 para todas as versões a partir do Visual Studio 2015. A versão do conjunto de ferramentas é v140 para o Visual Studio 2015, v141 para o 2017, v142 para o 2019 e v143 para o 2022. Digamos que você tenha bibliotecas de terceiros criadas pelo Visual Studio 2015. Você ainda pode usá-las em um aplicativo criado pelo Visual Studio 2017, 2019 ou 2022. Não é necessário recompilar com um conjunto de ferramentas correspondente. A versão mais recente do pacote redistribuível do Visual C++ (o Redistribuível) funciona para todas elas.

Restrições à compatibilidade binária

Há três restrições importantes à compatibilidade binária entre os conjuntos de ferramentas v140, v141, v142 e v143 e às atualizações de versão numeradas secundárias:

  • Os binários criados com versões diferentes dos conjuntos de ferramentas v140, v141, v142 e v143 podem ser combinados. A regra principal é que o vinculador só deve funcionar com entradas de dados criadas por um conjunto de ferramentas que seja da mesma versão (ou de uma versão anterior) que o próprio. Isso se aplica a aplicativos, bibliotecas importadas, bibliotecas estáticas e outros arquivos, conforme descrito em arquivos de entrada de LINK. Em alguns casos, uma biblioteca de importação para uma DLL vinculada implicitamente criada por uma versão posterior do conjunto de ferramentas pode ser vinculada usando uma versão anterior do conjunto de ferramentas, especialmente se a biblioteca de importação for usada extern "C" estritamente para as importações/exportações. Aqui estão alguns exemplos do que tudo isso significa:
    • Um aplicativo compilado com um conjunto de ferramentas de 2017 (v141, versões 15.0 a 15.9) pode ser vinculado a uma biblioteca estática compilada com o Visual Studio 2022 versão 17.8 (v143), mas a vinculação precisa ser feita usando um conjunto de ferramentas versão 17.8 ou posterior.
    • Aplicativos e bibliotecas criados usando o VS 2015, 2017, 2019 ou 2022 podem ser vinculados juntos, mas a vinculação precisa ser feita usando uma versão do conjunto de ferramentas tão ou mais recente que a do conjunto de ferramentas mais recente usado para criar qualquer um dos binários que você repassar para o vinculador. Por exemplo, considerando três binários criados com conjuntos de ferramentas do VS 2015 versão 14.3, VS 2017 versão 15.9 e VS 2019 versão 16.11, você pode vinculá-los usando qualquer versão de conjunto de ferramentas que seja 16.11 ou posterior.
    • Se uma DLL for criada com um conjunto de ferramentas mais recente, a biblioteca de importação poderá, às vezes, ser usada com conjuntos de ferramentas mais antigos se todas as exportações seguirem a convenção de chamada da linguagem C (extern "C"). No entanto, o único caso com suporte oficial é o consumo de um SDK do Windows mais recente com um conjunto de ferramentas mais antigo.
  • A Redistribuível que seu aplicativo usa tem uma restrição de compatibilidade binária semelhante. Quando você mistura binários criados por diferentes versões compatíveis do conjunto de ferramentas, a versão Redistribuível deve ser pelo menos tão nova quanto o conjunto de ferramentas mais recente usado por qualquer componente do aplicativo.
  • Bibliotecas estáticas ou arquivos de objeto compilados usando o switch de compilador /GL (otimização do programa inteiro) ou vinculados usando /LTCG (geração de código durante o tempo de vinculação) não são compatíveis com binários em diferentes versões, incluindo atualizações de versões secundárias. Todos os arquivos-objeto e bibliotecas compilados usando /GL e /LTCG devem usar exatamente o mesmo conjunto de ferramentas para a compilação e a vinculação final. Por exemplo, o código criado usando /GL no conjunto de ferramentas do Visual Studio 2019 versão 16.7 não pode ser vinculado ao código criado usando /GL no conjunto de ferramentas do Visual Studio 2019 versão 16.8. O compilador emite o erro fatal C1047.

Atualize o Pacote Redistribuível do Visual C++ do Visual Studio 2015 e mais recentes

Mantivemos o número da versão principal do Pacote Redistribuível do Visual C++ igual para o Visual Studio 2015, 2017, 2019 e 2022. Isso significa que apenas uma instância do Redistribuível pode ser instalada por vez. Uma versão mais recente substitui qualquer versão mais antiga que já esteja instalada. Por exemplo, um aplicativo pode instalar o Redistribuível a partir do Visual Studio 2015. Em seguida, outro aplicativo instala o Redistribuível a partir do Visual Studio 2022. A versão 2022 substitui a versão mais antiga, mas como elas são compatíveis com binário, o aplicativo anterior ainda funciona bem. Garantimos que a versão mais recente do Redistributable tenha todos os recursos mais recentes, atualizações de segurança e correções de bugs. É por isso que recomendamos sempre que você atualize para a versão mais recente disponível.

Da mesma forma, não é possível instalar um Redistribuível mais antigo quando uma versão mais recente já estiver instalada. O instalador relatará um erro se você tentar. Você verá um erro como este se instalar o Redistribuível 2017 ou 2019 em um computador que já tenha a versão 2022:

0x80070666 - Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.

Este erro ocorre por design. Recomendamos que você mantenha a versão mais recente instalada. Verifique se o instalador pode se recuperar desse erro de maneira silenciosa.

Importante

O suporte à biblioteca de runtime para Windows XP não está mais disponível no Pacote Redistribuível do Visual C++ para Visual Studio mais recente. O último redistribuível para dar suporte ao Windows XP é a versão 16.7 (versão 14.27.29114.0). Se seus aplicativos do Windows XP forem implantados ou atualizados para uma versão posterior do pacote redistribuível, os aplicativos não serão executados. Para mais informações e saber como obter uma versão do redistribuível que tenha suporte para Windows XP, consulte Configurar programas para o Windows XP.

Confira também

Histórico de alterações do Visual C++
Downloads do Pacote Redistribuível do Visual C++ com suporte mais recentes