A ligar estaticamente a biblioteca construída com versão diferente do C Runtime Library, ok ou ruim?

StackOverflow https://stackoverflow.com/questions/1872759

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top