2009-10-21 14 views
18

Estoy creando una biblioteca C++ de código abierto utilizando Visual Studio 2005. Me gustaría proporcionar libs precompilados junto con el código fuente. ¿Estas bibliotecas, compiladas con VS2005, también funcionarán con las versiones más nuevas de Visual Studio (especialmente VS Express Edition 2008)? ¿O necesito proporcionar libs por versión de VS por separado?¿Las bibliotecas de C++ creadas con diferentes versiones de Visual Studio son compatibles entre sí?

+0

no, en mi experiencia personal no pude usar la biblioteca generada por VC6 en 2008. – Satbir

+2

¿Ha considerado proporcionar archivos DLL en lugar de bibliotecas estáticas? Suponiendo que no está realizando operaciones "peligrosas" (como la asignación de memoria en el código del cliente con la desasignación correspondiente en su biblioteca), los clientes simplemente podrían cargar su biblioteca sin importar con qué compilador lo haya compilado o con qué bibliotecas lo vinculó. –

+0

Vea también: http: // stackoverflow.com/questions/8439595/are-compiled-lib-files-intercambiable-for-different-versions-of-microsoft-visu – DuckMaestro

Respuesta

14

Si está distribuyendo bibliotecas estáticas, es posible que pueda distribuir bibliotecas independientes de la versión, según lo que esté haciendo exactamente. Si solo hace llamadas al sistema operativo, entonces puede estar bien. C RTL funciones, tal vez. Pero si usa funciones, clases o plantillas de la Biblioteca Estándar de C++, entonces probablemente no.

Si distribuye archivos DLL, necesitará bibliotecas separadas para cada versión de VS. Algunas veces incluso necesita bibliotecas separadas para varios niveles de paquete de servicio. Y tal como lo menciona VolkerK, los usuarios de su biblioteca deberán usar configuraciones compatibles de compilador y enlazador. E incluso si hace todo bien, los usuarios pueden necesitar vincularse con otras bibliotecas que de alguna manera son incompatibles con las suyas.

Debido a estos problemas, en lugar de perder tiempo tratando de construir todas estas bibliotecas para sus usuarios, dedicaría el tiempo a hacerlos tan fáciles de compilar como sea posible, para que los usuarios puedan construirlos por sí mismos con un mínimo escándalo.

+2

E incluso las configuraciones del proyecto/indicadores del compilador pueden causar código binario incompatible dentro de la misma versión del compilador, p./Zc: wchar_t (que está activado por defecto era un cambio de rotura en VS2005) – VolkerK

17

Normalmente, no. Las bibliotecas creadas con las herramientas VS se vinculan al 'Microsoft C Runtime' (llamado MSVCRT seguido de un número de versión) que proporciona funciones de biblioteca estándar C y C++, y si intenta ejecutar un programa que requiere dos versiones diferentes de este tiempo de ejecución, entonces errores ocurrirán

Además de esto, las diferentes versiones del compilador producen diferentes códigos compilados y el código de una versión del compilador frecuentemente no es compatible con otro aparte en los casos más triviales (y si producían el mismo código, entonces habría no tiene sentido tener diferentes versiones :))

+0

> si intenta ejecutar un programa que requiere dos versiones diferentes de este tiempo de ejecución, se producirán errores. Funciona para nosotros, una de nuestras bibliotecas externas usa MSVCRT * .dll – KindDragon

6

En general, no es posible vincular bibliotecas compiladas con diferentes compiladores, diferentes versiones del mismo compilador e incluso configuraciones diferentes de la misma versión del compilador y obtener una aplicación que funcione. (Aunque podría funcionar para subconjuntos específicos del lenguaje y la biblioteca std.) No hay una interfaz binaria estándar para C++, ni siquiera una para alguna plataforma común como la hay en C.

Para lograr eso, o necesita Envuelva su biblioteca en una API de C o tendrá que enviar un archivo binario por cada compilación, versión de compilación y configuración del compilador que desee.

+2

anterior. GCC define un ABI estándar que usan todas las versiones de GCC. El compilador de Intel usa el mismo ABI para que las bibliotecas compiladas por Intel puedan ser utilizadas por gcc. Sin embargo, MSVCRT y glibc deben ser iguales entre la biblioteca y la aplicación, tal como lo menciona workmad3. –

+1

@Caspin: Sí, pero incluso esto falla si no ambas partes de esa ABI usan exactamente la misma versión de la biblioteca estándar y de cualquier otra biblioteca cuyos tipos quieran atravesar el límite. Es un boleto a miríadas de errores muy difíciles de depurar que podrían aparecer solo en ciertas circunstancias muy raras. BTDT. – sbi

2

Si su proyecto de biblioteca es una biblioteca estática, tendrá que proporcionar una compilación para cada versión de Visual Studio en la que desee que estén sus usuarios. En el ejemplo que proporcionó, eso equivale a proporcionar un VS2005 y una biblioteca VS2008.

Si su proyecto de biblioteca es una biblioteca dinámica, entonces evade un poco los problemas, pero significa que los usuarios necesitarán asegurarse de que usan el 'Microsoft C Runtime' que es compatible con su entorno de compilación. Puede eliminar ese criterio si conecta estáticamente el 'Microsoft C Runtime' en su biblioteca dinámica.

Cuestiones relacionadas