2009-04-24 15 views
11

Quando si sviluppa un framework basato su plugin C/C++ (= 2?) Con oggetti condivisi/librerie dinamiche che devono supportare lo scambio in tempo reale quali esempi potrebbero essere utili per esaminare i dettagli dell'implementazione?Buoni modelli per un sistema basato su plugin C/C++?

Grazie.

Nota: scambio dal vivo è il punto chiave qui, non c'è bisogno di riavviare il sistema è un requisito

+0

Potete approfondire il sistema operativo? –

+0

Vedere http://stackoverflow.com/questions/384121/creating-a-module-system-dynamic-loading-in-c come punto di partenza. – unwind

+0

Per Windows/altro sistema operativo? – RobS

risposta

9

Se siete su POSIX, dlopen(), dlsym() e dlclose() sono tutto ciò che serve.

Vedere man dlsym per dettagli ed esempi.

C'è un buon article sul caricamento delle librerie dinamiche e l'infrastruttura dei plugin è un esempio.

EDIT OP ha aggiunto Windows come requisito, quindi questo approccio non è di alcuna utilità poiché Windows non è conforme a POSIX. Tuttavia ci sono funzioni simili in WinAPI - vedi here.

+0

Se possibile, suggerirei di utilizzare una libreria indipendente dalla piattaforma come ACE http://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/a00110.html – lothar

5

Si consiglia di provare Boost.Extension ma attenzione: nonostante il suo nome, non è una delle librerie di boost.

Ecco uno link to its documentation.

+0

very niceits not boost (ancora) ma è nella sandbox –

2

Per i plugin C++ è possibile controllare this article in dettaglio come ottenerlo con le chiamate posix precedentemente citate.

Citando l'articolo:

Dato che siamo in grado di utilizzare queste funzioni per accedere alle funzioni in una libreria C, come possiamo li utilizziamo per classi di accesso in una libreria C++? Ci sono diversi problemi da superare. Uno è che dobbiamo essere in grado di individuare i simboli di cui abbiamo bisogno nella libreria. Questo è più difficile di quanto possa sembrare a causa della differenza tra il modo in cui i simboli sono memorizzati nei file C e C++.

4

Se si desidera caricare la libreria tra piattaforme diverse senza doverle sviluppare singolarmente per ciascuna API della piattaforma, è possibile utilizzare libltdl.

Libtool fornisce una piccola biblioteca, chiamato libltdl, che mira a nascondere le diverse difficoltà delle librerie dlopening dai programmatori. Consiste di poche intestazioni e piccoli file sorgente C che possono essere distribuiti con applicazioni che richiedono funzionalità di dlopening. Su alcune piattaforme, i cui linker dinamici sono troppo limitati per una semplice implementazione dei servizi libltdl, richiede GNU DLD, o emula solo collegamenti dinamici con il meccanismo dlpreopening di libtool.

libltdl attualmente supporta i seguenti meccanismi di collegamento dinamico:

  • dlopen (Solaris, Linux e vari gusti BSD)
  • shl_load (HP-UX)
  • LoadLibrary (Win16 e Win32)
  • load_add_on (BeOS)
  • NSAddImage o NSLinkModule (Darwin e Mac OS X)
  • GNU DLD (emula il collegamento dinamico per le librerie statiche)
  • dlpreopen di libtool (vedi vedi Dlpreopening)

Boost.Extension sembra supportare solo Windows PE dll s, UNIX ELF oggetti condivisi, e Mac Bundle Mach-O OS X. Bene, potrebbe essere sufficiente per voi ...

Problemi correlati