Compatibilidade binária C++ entre versões do Visual Studio
Os conjuntos de ferramentas do compilador Microsoft C++ (MSVC) no Visual Studio 2013 e versões anteriores não garantem compatibilidade binária entre as versões principais. Não é possível vincular arquivos de objeto, bibliotecas estáticas, bibliotecas dinâmicas e executáveis criados por diferentes versões desses conjuntos de ferramentas. Os ABIs, formatos de objeto e bibliotecas de tempo de execução são incompatíveis.
Alteramos esse comportamento no Visual Studio 2015 e versões posteriores. As bibliotecas de tempo de execução e os aplicativos compilados por qualquer uma dessas versões do compilador são compatíveis com binários. Isso se reflete no número principal do conjunto de ferramentas C++, que começa com 14 para todas as versões desde o Visual Studio 2015. (A versão do conjunto de ferramentas é v140 para Visual Studio 2015, v141 para 2017, v142 para 2019 e v143 para 2022). Digamos que você tenha bibliotecas de terceiros criadas pelo Visual Studio 2015. Você ainda pode usá-los em um aplicativo criado pelo Visual Studio 2017, 2019 ou 2022. Não há necessidade de recompilar com um conjunto de ferramentas correspondente. A versão mais recente do pacote Microsoft Visual C++ Redistributable (o Redistributable) funciona para todos eles.
Restrições à compatibilidade binária
Há três restrições importantes na compatibilidade binária entre os conjuntos de ferramentas v140, v141, v142 e v143 e atualizações de versão menores:
- Binários criados com diferentes versões dos conjuntos de ferramentas v140, v141, v142 e v143 podem ser combinados. A regra principal é que o vinculador só deve trabalhar com entradas criadas por um conjunto de ferramentas que seja a mesma versão (ou anterior) que ele próprio. Isso se aplica a aplicativos, bibliotecas de importação, bibliotecas estáticas e outros arquivos, conforme descrito em arquivos de entrada LINK. Em alguns casos, uma biblioteca de importação para um ligado implicitamente a um DLL criada por uma versão posterior do conjunto de ferramentas pode ser ligada com uma versão anterior do conjunto de ferramentas; especialmente se a biblioteca de importação usa exclusivamente
extern "C"
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 deve ser feita usando um conjunto de ferramentas da versão 17.8 ou posterior.
- Aplicativos e bibliotecas criados usando VS 2015, 2017, 2019 ou 2022 podem ser vinculados, mas a vinculação deve ser feita usando uma versão do conjunto de ferramentas que seja tão recente quanto, ou mais recente, do que o conjunto de ferramentas mais recente usado para criar qualquer um dos binários que você passa para o vinculador. Por exemplo, dados 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 do 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 às vezes pode ser usada com conjuntos de ferramentas mais antigos se todas as exportações seguirem a convenção de chamada de idioma C (
extern "C"
). No entanto, o único caso oficialmente suportado é consumir um SDK do Windows mais recente com um conjunto de ferramentas mais antigo.
- O 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 suportadas 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 de todo o programa) ou vinculados usando/LTCG
(geração de código em tempo de link)não são compatíveis binários entre versões, incluindo atualizações de versões secundárias. Todos os arquivos de objeto e bibliotecas compilados usando/GL
e/LTCG
devem usar exatamente o mesmo conjunto de ferramentas para a compilação e o link 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 erro fatal C1047.
Efetuar a atualização do Microsoft Visual C++ Redistributable do Visual Studio 2015 e versões posteriores
Mantivemos o número da versão principal do Microsoft Visual C++ Redistributable igual para o Visual Studio 2015, 2017, 2019 e 2022. Isso significa que apenas uma instância do Redistributable pode ser instalada de cada vez. Uma versão mais recente substitui qualquer versão mais antiga que já esteja instalada. Por exemplo, um aplicativo pode instalar o Redistributable do Visual Studio 2015. Em seguida, outro aplicativo instala o Redistributable do Visual Studio 2022. A versão 2022 substitui a versão mais antiga, mas como eles são compatíveis com binários, o aplicativo anterior ainda funciona bem. Certificamo-nos de que a versão mais recente do Redistribuível tem todas as funcionalidades mais recentes, atualizações de segurança e correções de bugs. É por isso que recomendamos sempre que 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á está instalada. O instalador relata um erro se tentares. Você verá um erro como este se tentar instalar o Pacote Redistribuível de 2017 ou 2019 numa máquina que já tenha a versão de 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 é por design. Recomendamos que mantenha a versão mais recente instalada. Certifique-se de que o instalador pode recuperar deste erro silenciosamente.
Importante
O suporte da biblioteca de tempo de execução para o Windows XP não está mais disponível no Visual C++ Redistributable for Visual Studio mais recente. O último redistribuível a suportar o Windows XP é a versão 16.7 (versão do ficheiro 14.27.29114.0). Se os seus aplicativos do Windows XP forem distribuídos com ou atualizados para uma versão posterior da distribuição, os aplicativos não serão executados. Para obter mais informações e como obter uma versão do redistribuível que suporte o Windows XP, consulte Configurando programas para o Windows XP.
Ver também
Histórico de alterações do Visual C++
Os últimos downloads suportados do Visual C++ Redistributable
Como auditar o uso da versão do Visual C++ Runtime
Perguntas frequentes sobre o ciclo de vida do - Visual C++ Redistribuível e bibliotecas de tempo de execução