2012-04-21 18 views
5

Voglio creare un modulo GTK personalizzato che dovrebbe essere caricato quando avvio un'applicazione GTK.Come creare e caricare un modulo GTK?

documentazione su questo argomento è rara, ho cercato molto, ma non sono riuscito a farlo funzionare. Sono su Ubuntu Linux con GTK3 e ho provato sofar:

  • Compilato e collegato una libreria condivisa con il metodo void gtk_module_init(gint *argc, gchar ***argv[]) all'interno. Per quanto ho capito, questo dovrebbe essere sufficiente per creare un modulo semplice. codice completo:
#include <iostream> 
#include <gtk/gtk.h> 

void gtk_module_init(gint *argc, gchar ***argv[]) { 
    std::cout << "huhu" << std::endl; 
} 
  • Mettere questo lib in /usr/lib/x86_64-linux-gnu/gtk-3.0/modules/libtest-gtk-module.so
  • cercato di lanciare un'applicazione in questo modo: gnomine --gtk-module=libtest-gtk-module.so Ma tutto quello che ottiene è: Gtk-Message: Failed to load module "libtest-gtk-module.so"

Quindi, che cosa deve essere fatto in modo da rendere GTK caricare questa libreria?

Molte grazie in anticipo!

risposta

2

È necessario rendere il sistema consapevole della libreria. Per una libreria in una directory di sistema, dovrebbe essere sufficiente per eseguire ldconfig come root. Dai un'occhiata al tutorial here.

[EDIT]

ho avuto il caricamento del modulo come segue:

  • Poiché si tratta di codice C++, è necessario assicurarsi che il nome della funzione, non è il nome storpiato:

    extern "C" { 
    void gtk_module_init(gint *argc, gchar ***argv[]) { 
        std::cout << "huhu" << std::endl; 
    } 
    } 
    
  • ho costruito con il seguente:

    g++ -fPIC -shared -Wl,-soname,libfoo.so.1 -olibfoo.so.1.0.1 `pkg-config --libs --cflags gtk+-3.0` t.c 
    
  • Ho usato un percorso assoluto per evitare scherzi con ldconfig, questa è probabilmente la cosa migliore da fare, mentre lo sviluppo del modulo:

    ~$ gedit --gtk-module=/home/eric/libfoo.so.1.0.1 t.c 
    huhu 
    

Questo è in Mint LMDE, non Ubuntu, ma io don Penso che importi.

+0

Beh, ci ho provato. Ma senza successo. Forse c'è qualche errore nel modulo? L'errore fornito da GTK non è molto utile ... E grazie per il collegamento, sembra piuttosto utile! – Simme

+0

+1 @Simme: controlla la modifica. Molto probabilmente il tuo problema riguardava il problema del mangling del nome. È possibile utilizzare 'readelf' o altre utility di questo tipo per verificare se è presente il simbolo' gtk_module_init' (come è senza alcun prefisso/suffisso i.e. mangling) –

0

provo a farlo funzionare con strace:

strace -eopen add_your_command_here 2>&1 | grep libtest-gtk-module.so 

Lo scoprirete in cui il programma è alla ricerca di quel file.

Problemi correlati