Pregunta

¿Es posible que gcc se vincule con una biblioteca creada con Visual C++?Si es así, ¿hay algún conflicto/problema que pueda surgir al hacerlo?

¿Fue útil?

Solución

Algunos de los comentarios en las respuestas aquí son demasiado generalistas.

Si bien no, en el caso específico mencionado, los binarios de gcc no se vincularán con una biblioteca VC++ (AFAIK).El medio real de interconectar código/bibliotecas es una cuestión del estándar ABI que se utilice.

Un estándar cada vez más común en el mundo integrado es el estándar EABI (o ARM ABI) (basado en el trabajo realizado durante el desarrollo de Itanium). http://www.codesourcery.com/cxx-abi/).Si los compiladores cumplen con EABI, pueden producir ejecutables y bibliotecas que funcionarán entre sí.Un ejemplo de múltiples cadenas de herramientas trabajando juntas es el compilador RVCT de ARM, que produce archivos binarios que funcionarán con los archivos binarios GCC ARM ABI.

(El enlace de origen del código está inactivo en este momento, pero se puede almacenar en caché en Google)

Otros consejos

Supongo que no.Por lo general, los compiladores de C++ tienen métodos bastante diferentes de manipulación de nombres, lo que significa que los enlazadores no podrán encontrar los símbolos correctos.Por cierto, esto es algo bueno, porque el estándar permite que los compiladores de C++ tengan niveles de incompatibilidad mucho mayores que solo este, lo que hará que su programa falle, muera, se coma cachorros y manche pintura por toda la pared.

Los esquemas habituales para solucionar este problema suelen implicar técnicas independientes del lenguaje como COM o CORBA.Un método santificado más simple es utilizar "envoltorios" de C alrededor de su código C++.

No es posible.Generalmente ni siquiera es posible vincular bibliotecas producidas por diferentes versiones del mismo compilador.

No.Simple y llanamente :-)

Sí, si lo convierte en un enlace dinámico y la interfaz es estilo C.lib.exe generará bibliotecas de importación que son compatibles con la cadena de herramientas gcc.

Eso resolverá sus problemas de vinculación.Sin embargo, eso es sólo el comienzo del problema.

Sus mayores problemas serán cosas como excepciones y asignación de memoria.

  • Debe asegurarse de que no haya ninguna excepción entre VC++ y el código gcc; no hay garantías de compatibilidad.
  • Cada objeto de la biblioteca VC++ deberá vivir en el montón porque:
  • No mezcle gcc new/delete con nada de VC++, sucederán cosas malas.Esto también se aplica a la construcción de objetos en la pila.Sin embargo, si crea una interfaz como create_some_obj()/delete_some_obj() no terminará usando gcc new para construir objetos VC++.Tal vez crear un pequeño objeto de manipulación que se encargue de la construcción y la destrucción.De esta manera conserva RAII, pero aún usa la interfaz c para la interfaz verdadera.
  • La convención de llamada debe ser correcta.En VC++ existen cdecl y stdcall.Si gcc intentó llamar a una función importada con el tipo de llamada incorrecto, sucederán cosas malas.

La conclusión es mantener una interfaz simple que sea compatible con ANSI C, y todo debería estar bien.El hecho de que el loco C++ siga detrás está bien, siempre y cuando esté contenido.

Ah, y asegúrese de que todo el código sea reentrante, o corre el riesgo de abrir otros gusanos.

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