Domanda

I sistemi plug-in in C++ sono difficili perché l'ABI non è definito correttamente e ogni compilatore (o versione dello stesso) segue le proprie regole.Tuttavia, COM su Windows mostra che è possibile creare un sistema di plug-in minimo che consenta ai programmatori con diversi compilatori di creare plug-in per un'applicazione host utilizzando un'interfaccia semplice.

Cerchiamo di essere pratici e lasciamo da parte per un minuto lo standard C++, che non è molto utile in questo senso.Se voglio scrivere un'app per Windows e Mac (e facoltativamente Linux) che supporti i plug-in C++ e se voglio offrire agli autori di plug-in una scelta ragionevolmente ampia di compilatori (ad esempio versioni di Visual C++ vecchie di meno di 2 anni , GCC o il compilatore C++ di Intel), su quali funzionalità di C++ potrei contare?

Naturalmente presumo che i plug-in vengano scritti per una piattaforma specifica.

A mente fredda, ecco alcune funzionalità C++ a cui riesco a pensare, con quella che penso sia la risposta:

  • layout vtable, per utilizzare oggetti attraverso classi astratte?(SÌ)
  • tipi incorporati, puntatori?(SÌ)
  • strutture, sindacati?(SÌ)
  • eccezioni?(NO)
  • funzioni "C" esterne?(SÌ)
  • funzioni "C" non esterne stdcall con tipi di parametri incorporati?(SÌ)
  • Funzioni "C" non stdcall non esterne con tipi di parametri definiti dall'utente?(NO)

Apprezzerei qualsiasi esperienza tu abbia in quell'area che potresti condividere.Se conosci qualche app di discreto successo dotata di un sistema di plug-in C++, va bene anche questo.

Carlo

È stato utile?

Soluzione

Il diario del dottor Dobb contiene un articolo Costruire il proprio framework di plugin:Parte 1 che è una lettura piuttosto buona sull'argomento.È l'inizio di una serie di articoli che trattano l'architettura, lo sviluppo e l'implementazione di un framework di plugin multipiattaforma C/C++.

Altri suggerimenti

Potresti anche prendere in considerazione la possibilità di sostituire l'interfaccia del plugin convenzionale con un'interfaccia di scripting.Esistono alcuni ottimi collegamenti per diversi linguaggi di scripting in C/C++ che hanno già risolto il tuo problema.Potrebbe non essere una cattiva idea costruire sopra di essi.Ad esempio, dai un'occhiata a Boost.Python.

Qt ha un sistema molto carino per i plugin che ho usato in passato.Utilizza il sistema di meta-oggetti di Qt per superare molti dei problemi tipicamente riscontrati quando si tenta di sviluppare plugin C++.

Un esempio è come Q_DECLARE_INTERFACE funziona, per impedirti di utilizzare un plugin incompatibile.Un altro è il costruire la chiave, per assicurarti di caricare il plugin corretto per la tua architettura, sistema operativo, compilatore.Se non usi il sistema di plugin di Qt, queste sono cose di cui dovrai preoccuparti e per cui dovrai inventare soluzioni da solo.Non è necessariamente scienza missilistica, e non sto dicendo che falliresti, ma i ragazzi di Trolltech sono piuttosto intelligenti e hanno passato un po' di tempo a pensarci, e preferirei usare ciò che hanno creato piuttosto che reinventare la ruota da solo .

Un altro esempio è quello RTTI in genere non funziona oltre i limiti della DLL, ma quando si utilizza Qt, cose come qoggetto_cast che si basano sul sistema di meta-oggetti funzionano oltre i confini della DLL.

Penso che tu sia sicuro nel creare un sistema di plugin basato su:

  • Packaging delle funzionalità del plugin nella libreria (.dll, .so, ecc.)
  • Richiedere che il plugin esponga le principali esportazioni in linguaggio C.
  • Richiedere che il plugin implementi (e restituisca un puntatore/riferimento a) un'interfaccia C++ astratta.

Probabilmente il sistema di plugin C++ di maggior successo:buon vecchio Adobe Photoshop.E se non quello, uno dei formati di sintetizzatore virtuale come VSTi ecc.

Il libro C++ imperfetto di Matthew Wilson ha delle belle informazioni a riguardo.

Il consiglio sembra essere:fintanto che usi lo stesso compilatore (o equivalente), puoi usare C++, altrimenti è meglio usare C come interfaccia sopra il tuo codice C++.

ASSO ha un'architettura plug-in multipiattaforma.

Guardare:

  1. ACEDLL
  2. Gestore DLL ACE

Suggerirei di dare un'occhiata al libro
La guida del programmatore ACE

Firefox funziona su XPCOM (http://www.mozilla.org/projects/xpcom/).Si ispira a Microsoft COM ma è multipiattaforma.

Ho il mio motore di gioco che ha un sistema plug-in C++.

Ho del codice nei file header in modo che venga inserito nell'unità di compilazione del plugin.

Le funzioni più grandi che risiedono nel motore principale vengono chiamate tramite una funzione C esportata (il plugin chiama MyObject_somefunction(MyObject *obj) che nel motore chiama semplicemente obj->somefunction()).Se chiamare una funzione C è brutto per i tuoi gusti, allora con qualche trucco sull'intestazione, quando l'intestazione è inclusa nel plugin, fai in modo che la funzione membro #definita chiami la funzione C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

Le funzioni virtuali devono essere pure oppure il codice risiede nel file di intestazione.Se non eredito da una classe e ne istanzo semplicemente una, il codice della funzione virtuale può vivere nel motore, ma la classe deve esportare alcune funzioni C per creare e distruggere l'oggetto chiamato dal plugin.

Fondamentalmente, i trucchi che ho usato, con l'obiettivo di mantenere la totale indipendenza dalla piattaforma, equivalgono semplicemente a esportazioni in C e trucchi per i file di intestazione.

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