Domanda

È possibile che gcc si colleghi a una libreria creata con Visual C++?Se sì, ci sono conflitti/problemi che potrebbero sorgere da ciò?

È stato utile?

Soluzione

Alcuni dei commenti nelle risposte qui sono leggermente troppo generalistici.

Anche se no, nel caso specifico menzionato i binari gcc non si collegheranno a una libreria VC++ (AFAIK).Il mezzo effettivo per interconnettere codice/librerie è una questione di utilizzo dello standard ABI.

Uno standard sempre più comune nel mondo embedded è lo standard EABI (o ARM ABI) (basato sul lavoro svolto durante lo sviluppo di Itanium http://www.codesourcery.com/cxx-abi/).Se i compilatori sono conformi a EABI possono produrre eseguibili e librerie che funzioneranno tra loro.Un esempio di più toolchain che lavorano insieme è il compilatore RVCT di ARM che produce binari che funzioneranno con i binari GCC ARM ABI.

(Il collegamento al codice sorgente al momento non è attivo ma può essere memorizzato nella cache di Google)

Altri suggerimenti

Immagino di no.Di solito i compilatori C++ hanno metodi piuttosto diversi di modifica dei nomi, il che significa che i linker non riusciranno a trovare i simboli corretti.Questa è una buona cosa comunque, perché i compilatori C++ sono autorizzati dallo standard ad avere livelli di incompatibilità molto maggiori rispetto a questo che farà sì che il tuo programma si blocchi, muoia, mangi cuccioli e spalmi vernice su tutto il muro.

Gli schemi usuali per aggirare questo problema di solito coinvolgono tecniche indipendenti dal linguaggio come COM o CORBA.Un metodo santificato più semplice consiste nell'utilizzare i "wrapper" C attorno al codice C++.

Non è possibile.Di solito non è nemmeno possibile collegare librerie prodotte da versioni diverse dello stesso compilatore.

NO.Chiaro e semplice :-)

Sì, se lo rendi un collegamento dinamico e rendi l'interfaccia in stile C.lib.exe genererà librerie di importazione compatibili con la toolchain gcc.

Ciò risolverà i tuoi problemi di collegamento.Tuttavia questo è solo l’inizio del problema.

I tuoi problemi più grandi riguarderanno cose come le eccezioni e l'allocazione della memoria.

  • È necessario assicurarsi che nessuna eccezione passi dal codice VC++ al gcc, non ci sono garanzie di compatibilità.
  • Ogni oggetto della libreria VC++ dovrà vivere nell'heap perché:
  • Non mescolare gcc new/delete con qualsiasi cosa di VC++, accadranno cose brutte.Questo vale anche per la costruzione di oggetti in pila.Tuttavia, se crei un'interfaccia come create_some_obj()/delete_some_obj() non finirai per utilizzare gcc new per costruire oggetti VC++.Forse creare un piccolo oggetto gestore che gestisca la costruzione e la distruzione.In questo modo preservi RAII, ma usi comunque l'interfaccia c per l'interfaccia vera.
  • La convenzione di chiamata deve essere corretta.In VC++ ci sono cdecl e stdcall.Se gcc provasse a chiamare una funzione importata con il tipo di chiamata sbagliato, accadrebbero cose brutte.

La conclusione è mantenere un'interfaccia semplice che sia conforme ad ANSI C e dovresti stare bene.Il fatto che il C++ pazzo continui dietro va bene, purché sia ​​contenuto.

Oh, e assicurati che tutto il codice sia rientrante, altrimenti rischi di aprire un intero altro verme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top