2010-11-27 14 views
5

Sto sviluppando il plug-in per Win32 utilizzando mingw e crosscompilation da Linux. Anche se il mio plugin è stato caricato con successo dall'applicazione e ho anche ottenuto un'interfaccia com dall'app, non posso chiamare le funzioni da lì - l'app è in crash. Penso che ciò sia dovuto ad un errato allineamento vtable dell'implementazione dell'interfaccia in mingw (questo ha funzionato perfettamente con MSVS).Come impostare l'allineamento per le funzioni virtuali?

Qualsiasi aiuto sarà apprezzato, grazie.

risposta

4

L'allineamento VTable (infatti, l'intero sistema VTable) è completamente dipendente dall'implementazione. Devi usare lo stesso compilatore, compilato con gli stessi interruttori/impostazioni, in modo da avere un programma funzionante dopo il collegamento.

Non è possibile collegare i file binari generati da msvc a quelli generati da MinGW per questo motivo. Anche se le tabelle sono allineate allo stesso modo, gli algoritmi di mangling dei nomi sono diversi e nessuno dice che i due compilatori sceglierebbero lo stesso ordine per le singole funzioni all'interno del vtable stesso.

Se è necessaria un'interfaccia portatile tra i due compilatori, è necessario farlo con un'interfaccia C (tecnicamente uno extern "C"), che ha un ABI standardizzato.

+1

COM è anche un ABI, ma forse uno che MinGW non supporta così facilmente. :) (COM si basa sul presupposto (non del tutto vero!) Che tutti i compilatori C++ su una determinata piattaforma utilizzeranno la stessa struttura e layout vtable. Sono sorpreso che MinGW lo renda così difficile come la COM è una parte importante di Win32 Altri compilatori C++ supportano tuttavia COM bene, quindi non è necessario utilizzare C o lo stesso compilatore, solo un discreto compilatore C++ per Windows. Naturalmente, è anche possibile eseguire COM in modo C (il codice generato dal Il compilatore IDL di solito definisce anche un'interfaccia C, se è più semplice. –

Problemi correlati