C++ Boost Plugin

Da Andreabont's Wiki.

Questa libreria delle Boost permette di creare con facilità dei plugin con interfaccia predefinita caricabili attraverso librerie dinamiche.

Codice

Il codice sorgente si divide in 3 parti, il file header dove viene definita l'interfaccia del plugin, una o più implementazioni di questa interfaccia, e il programma principale che carica e usa il plugin.

plugin_api.h

Questa è l'interfaccia del plugin.

class plugin_api {
public:
    virtual int funzione(int i) = 0;
    virtual ~plugin_api() {}
};

plugin_impl.cpp

Questa è una possibile implementazione.

#include <boost/config.hpp>
#include <iostream>
#include "plugin_api.h"

namespace {
    
class plugin_impl : public plugin_api {
public:

    int funzione(int i) {
        return i*2;
    }

};

extern "C" BOOST_SYMBOL_EXPORT plugin_impl myPlugin; // Alias del plugin
plugin_impl myPlugin;
    
}

main.cpp

Questo è il programma che carica il plugin

#include <boost/dll/import.hpp>
#include <iostream>
#include "plugin_api.h"

int main(int argc, char* argv[]) {

    boost::shared_ptr<plugin_api> plugin = boost::dll::import<plugin_api>(
        "./libplugin",   // Path libreria .so
        "myPlugin",      // Alias del plugin
        boost::dll::load_mode::append_decorations
    );

    std::cout << plugin->funzione(3) << std::endl;

}

Compilare

Plugin

g++ -std=c++11 -shared -fPIC -o libplugin.so plugin_api.h plugin_impl.cpp

Main

g++ main.cpp -std=c++11 -lboost_system -lboost_filesystem -ldl

Analisi del plugin

Controllo dell'alias

Utile per controllare se nella libreria condivisa c'è il simbolo dell'alias voluto.

#include <boost/dll/import.hpp>

int main () {

    boost::dll::shared_library lib("libplugin.so", boost::dll::load_mode::append_decorations);

    lib.has("myPlugin"); // Ritorna true

}