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í?
¿Las bibliotecas de C++ creadas con diferentes versiones de Visual Studio son compatibles entre sí?
Respuesta
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.
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
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 :))
> 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
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.
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. –
@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
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.
- 1. ¿Cómo identificar si dos versiones diferentes de gcc son compatibles?
- 2. ¿Las API de Java Servlet son compatibles con versiones anteriores?
- 3. ¿Los scripts CPython, IronPython, Jython son compatibles entre sí?
- 4. Cargando múltiples bibliotecas compartidas con diferentes versiones
- 5. Son mensajes protobuf compatibles en todas las versiones de protobuf
- 6. Visual Studio: DLL diferentes para configuraciones
- 7. Mezclar diferentes versiones de bibliotecas Java
- 8. Configuración de InstallShield LE para eliminar versiones anteriores creadas con Visual Studio Setup Projects
- 9. Son las funciones makecontext()/swapcontext() compatibles con C++
- 10. ¿Qué navegadores son compatibles con "! Important"?
- 11. Esquemas de colores VIsual Studio 2010 compatibles con ReSharper?
- 12. Mezclar bibliotecas de diferentes compiladores de C++
- 13. ¿Cómo creo impulso con Visual Studio 2008 cuando tengo instaladas varias versiones de Visual Studio?
- 14. SQLAlchemy con Python 3.2: ¿las extensiones C no son compatibles?
- 15. ¿Cuáles son las características más abusadas en Visual Studio/C#?
- 16. ¿Qué navegadores son compatibles con document.activeElement?
- 17. ¿Las expresiones lambda son compatibles con Razor?
- 18. Trabajar con diferentes versiones/ramas de la misma solución de Visual Studio 2005
- 19. ¿Las enumeraciones son compatibles con JDBC?
- 20. ¿Son mejores las diferentes herramientas de control de versiones para diferentes idiomas?
- 21. dependencias circulares entre dlls con visual studio
- 22. Visual Studio 2010: ¿conserva las propiedades del proyecto entre las diferentes configuraciones de compilación?
- 23. Haciendo servicios WCF compatibles con versiones anteriores
- 24. Visual Studio 2010 y Windows 2000
- 25. ¿Cuáles son las bibliotecas comunes para C?
- 26. ¿Cómo soporto las diferentes versiones de OpenGL?
- 27. Las bibliotecas de terceros se refieren a diferentes versiones de log4net.dll
- 28. Excepción: "formatos de URI no son compatibles"
- 29. Versiones de origen para Visual Studio Express
- 30. ¿Cuáles son las diferencias entre C# .net y Visual Basic.net?
no, en mi experiencia personal no pude usar la biblioteca generada por VC6 en 2008. – Satbir
¿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ó. –
Vea también: http: // stackoverflow.com/questions/8439595/are-compiled-lib-files-intercambiable-for-different-versions-of-microsoft-visu – DuckMaestro