A ligar estaticamente a biblioteca construída com versão diferente do C Runtime Library, ok ou ruim?
-
18-09-2019 - |
Pergunta
Considere este cenário: Um ligações de aplicações à biblioteca 3o partido a.
A é construído usando MSVC 2008 e é estaticamente ligando (isto é. Construída com / MT) para o v9.0 C Tempo de execução da biblioteca.
O aplicativo é construído usando MSVC 2005 e está vinculado estaticamente a A e (usando / MT) para o v8.0 C Runtime Library.
Eu posso ver problemas com isso - por exemplo, se os tipos são alteradas nos cabeçalhos entre as versões da biblioteca de tempo de execução.
É tomado cuidado para manter os cabeçalhos de biblioteca de tempo de execução compatíveis entre as versões, ou deve-se sempre certificar-se de todas as bibliotecas estaticamente ligadas estão ligando para a mesma versão da biblioteca de tempo de execução?
Solução
deve não será um problema. Cada links de biblioteca para o seu próprio tempo de execução e funciona na maior parte de forma independente de outras bibliotecas no processo. O problema surge quando as bibliotecas ABI é mal definido. Se qualquer tipo de pilha objeto alocado é alocado em uma biblioteca, passou através de uma fronteira biblioteca e 'liberado' na outra biblioteca não vão ser problemas como um gerenciador de heap diferente está sendo usado para liberar um bloco a partir do gerenciador de heap usado para alocar -lo.
Qualquer tipo de c-runtime definido struct, objeto ou entidade não deve ser passado em frente boundries, onde uma versão de tempo de execução diferente pode estar a ser utilizado: - FILE * 's obtidos a partir de uma biblioteca, por exemplo terá nenhum significado para uma biblioteca diferente ligado contra um tempo de execução diferente.
Enquanto o uso da API biblioteca somente tipos de matérias-primas, e não tente free () aprovada em ponteiros, ou passar para fora ponteiros para malloc internamente () 'd memória que eles esperam que a aplicação (ou outra biblioteca) para livre () você deve estar ok.
É fácil cair para o FUD que "qualquer coisa pode dar errado" se c-tempos de execução são misturados, mas você tem que lembrar que libs e bibliotecas dinâmicas (.so / .dll / .dylib) têm sido tradicionalmente desenvolvida no uma grande variedade de línguas:. permitindo que o código escrito em asm, C, C ++, Fortran, Pascal etc para comminicate através de uma interface binária eficiente CPU eficaz
Por pânico de repente quando C está sendo ligado a C?
Outras dicas
Este é um plano muito ruim. Evitar. Ou recompilar a biblioteca em 2005 ou compilar a aplicação em 2008.
Não é uma boa idéia. Você não tem controle sobre as suposições feitas pelas bibliotecas de tempo de execução e como eles implementar certos tipos. Isto é mais provável vai criar uma confusão diabólica que não.