2010-11-27 19 views
5

Estoy desarrollando plug-in para Win32 usando mingw y crosscompilation de linux. A pesar de que mi complemento se cargó satisfactoriamente con la aplicación e incluso obtuve una interfaz de interfaz de la aplicación, no puedo llamar a las funciones desde allí: la aplicación se ha bloqueado. Creo que esto se debe a la alineación de vtable incorrecta de la implementación de la interfaz en mingw (esto funcionó perfectamente con MSVS).¿Cómo establecer la alineación para funciones virtuales?

Cualquier ayuda será apreciada, gracias.

Respuesta

4

La alineación de la tarjeta (de hecho, todo el sistema de VTable) depende completamente de la implementación. Debe usar el mismo compilador, compilado con los mismos conmutadores/configuraciones, para tener un programa viable después del enlace.

No puede vincular los binarios generados por msvc con los generados por MinGW por este motivo. Incluso si tiene las tablas para alinear lo mismo, los algoritmos de creación de nombres de nombres son diferentes, y nadie dice que los dos compiladores elegirían el mismo orden para las funciones individuales dentro de la tabla virtual.

Si necesita una interfaz portátil entre los dos compiladores, entonces tiene que hacerlo con una interfaz C (técnicamente una extern "C"), que tiene un ABI estandarizado.

+1

COM también es un ABI, pero quizás uno que MinGW no admite tan fácilmente. :) (COM se basa en el supuesto (¡no del todo cierto!) De que todos los compiladores de C++ en una plataforma determinada usarán la misma estructura y diseño de vtable. Me sorprende que MinGW lo haga tan difícil ya que COM es una parte importante de Win32 Sin embargo, otros compiladores de C++ son compatibles con COM, por lo que no necesita usar C o el mismo compilador, solo un compilador decente de C++ para Windows. Por supuesto, también puede hacer COM en línea recta C (el código generado por el El compilador IDL normalmente también define una interfaz C) si es más fácil. –

Cuestiones relacionadas