Estáticamente ligado con biblioteca construida con diferente versión de C biblioteca de ejecución, bien o mal?

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

Pregunta

Considere este escenario: Una aplicación enlaces a tercera biblioteca de partido. Un

A se construye utilizando MSVC 2008 y está estáticamente de enlace (es decir. Construida con / MT) a la v9.0 C biblioteca de ejecución.

La aplicación está construida usando MSVC 2005 y es la vinculación estática a A y (utilizando / MT) a la v8.0 C biblioteca de ejecución.

Puedo ver problemas con esto - por ejemplo, si los tipos se cambian en las cabeceras entre las versiones de la biblioteca en tiempo de ejecución.

Es cuidado para mantener las cabeceras de la biblioteca de tiempo de ejecución compatibles entre versiones, o si uno siempre asegúrese de que todas las bibliotecas enlazadas estáticamente están ligando a la misma versión de la biblioteca de tiempo de ejecución?

¿Fue útil?

Solución

debe no ser un problema. Cada biblioteca enlaces a su propio tiempo de ejecución y en su mayoría funciona de manera independiente de otras bibliotecas en el proceso. El problema se produce cuando las bibliotecas ABI está mal definidos. Si cualquier tipo de montón de objetos asignados se asigna en una biblioteca, pasó a través del límite de la biblioteca y 'liberados' en otra biblioteca no va a haber problemas como un administrador de pila diferente se utiliza para liberar a una cuadra del administrador de pila utiliza para asignar a él.

Cualquier tipo de c-tiempo de ejecución definido estructura, objeto o entidad no debe ser pasado al otro lado de limites, donde podría estar siendo utilizado una versión de tiempo de ejecución diferente: - FILE * 's obtenido de una biblioteca, por ejemplo, no tendrá ningún significado a una biblioteca diferente vinculado en contra de un tiempo de ejecución diferente.

Siempre y cuando el uso de la API de biblioteca de tipos única primas, y no trate de free () aprobada en punteros, o pasar a cabo punteros a malloc internamente () 'd de memoria que esperan que la aplicación (u otra biblioteca) para libre () debe estar bien.

Es fácil caer en el FUD que "cualquier cosa puede ir mal" si c-tiempos de ejecución se mezclan, pero hay que recordar que librerías y bibliotecas dinámicas (.so / .dll / .dylib) tradicionalmente se han desarrollado en una amplia variedad de idiomas:. permitiendo que el código escrito en asm, C, C ++, Fortran, Pascal, etc para comminicate través de una interfaz binaria eficiente CPU eficaz

¿Por qué el pánico de repente cuando C está siendo vinculado a C?

Otros consejos

Este es un muy mal plan. Evitar. O bien volver a compilar la biblioteca en 2005 o compilar la aplicación en 2008.

No es una buena idea en absoluto. Usted no tiene control sobre las suposiciones hechas por las bibliotecas de tiempo de ejecución y cómo se implementan ciertos tipos. Esto es más probable que va a crear un lío de mil demonios que no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top