2013-06-02 13 views
5

Ho un programma di disegno che utilizza SDL, scritto in C++. Vorrei creare un'interfaccia grafica solo in Vala e usarla per chiamare funzioni da un programma (le funzioni sono pronte per l'uso e voglio solo chiamarle dalla GUI). Stavo cercando soluzioni come VAPI e stavo pensando di utilizzare GObject, ma non posso abbracciarle entrambe. Qualcuno ha fatto cose simili e mi può suggerire una soluzione al mio problema?GUI di Vala e logica in C++

+0

Cosa ti fa pensare, non è possibile associare un API GObject-based con un VAPI? * La maggior parte * dei VAPI disponibili fa proprio questo ... – nemequ

+0

Ho provato a compilare il codice Vala su C e quindi a creare un file oggetto. Ho creato un file oggetto dal codice C++. Poi ho provato a collegare due file con '-lglib' e' -lgobject' in g ++. Sfortunatamente, il collegamento di un oggetto dal codice Vala con la funzione scritta in C++ restituisce un errore. – Ocelpers

+0

Potresti postare l'errore qui? – MrEricSir

risposta

13

Se si desidera utilizzare il codice C++ in Vala, vengono preparati correttamente. Ecco un esempio.

Per prima cosa devi dire al compilatore valac che la funzione è definita da qualche altra parte. Usiamo la direttiva extern.

// ccodetest.vala 
extern void cpp_test_function(); 

void main() { 
    stdout.printf ("This is Vala code\n"); 
    cpp_test_function(); 
} 

Poi le funzioni in C++ sono adeguatamente collegati con i file oggetto derivato da C, noi li dichiariamo come extern "C".

// cpplibrary.cpp 
# include 

using namespace std; 

extern "C" void cpp_test_function() { 
    cout << "This is a C + + code\n"; 
} 

Quando siamo così pronti, siamo in grado di compilare il codice Vala a C. Otteniamo ccodetest.c.

valac -C ccodetest.vala

Ora possiamo usare gcc per compilare il file oggetto. Otteniamo ccodetest.o.

gcc-o ccodetest.o ccodetest.c-c-I /usr/include/glib-2.0/ -I /usr/include/glib-2.0/glib/ -I /usr/lib/glib-2.0/include/

File C++ compilare il seguente.

g++ -o cpplibrary.cpp.o cpplibrary.cpp -c

Alla fine ci collega entrambi i file.

g++ -o ccode_test ccodetest.o cpplibrary.cpp.o -L /usr/lib/ -lglib-2.0 -lgobject-2.0

Il programma funziona come segue:

$ ./ccode_test 
This is Vala code 
This is a C++ code