2013-06-02 12 views
5

Mam program do rysowania, który używa SDL, napisany w C++. Chciałbym stworzyć interfejs graficzny tylko w Vala i używać go do wywoływania funkcji z programu (funkcje są gotowe do użycia i chcę je wywoływać tylko z GUI). Szukałem rozwiązań jako VAPI i myślałem o używaniu GObject, ale nie mogę objąć obu. Czy ktoś zrobił podobne rzeczy i czy możesz zaproponować mi rozwiązanie mojego problemu?Vala GUI i logika w C++

+0

Co sprawia, że ​​myślisz, że nie może związać API gobject opartego o interfejsie VAPI? * Większość * dostępnych VAPI właśnie to robi ... – nemequ

+0

Próbowałem skompilować kod Vala do C, a następnie utworzyć plik obiektowy. Stworzyłem plik obiektowy z kodu C++. Następnie spróbowałem połączyć dwa pliki za pomocą '-lglib' i' -lgobject' w g ++. Niestety, łączenie obiektu z kodu Vala z funkcją napisaną w C++ zwraca błąd. – Ocelpers

+0

Czy mógłbyś wysłać tutaj błąd? – MrEricSir

Odpowiedz

13

Jeśli chcesz użyć kodu C++ w Vala, przygotowujemy je poprawnie. Oto przykład. Najpierw musisz powiedzieć kompilatorowi valac, że funkcja jest zdefiniowana gdzie indziej. Użyjmy dyrektywy extern.

// ccodetest.vala 
extern void cpp_test_function(); 

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

Wtedy funkcje w C++ są odpowiednio połączone z plikami obiektów pochodzących z C, możemy zadeklarować je jako extern „C”.

// cpplibrary.cpp 
# include 

using namespace std; 

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

Kiedy jesteśmy więc gotowi, możemy skompilować kod Vala do C. Otrzymujemy ccodetest.c.

valac -C ccodetest.vala

Teraz możemy użyć gcc skompilować plik obiektowy. Otrzymujemy 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/

pliku C++ skompilować w następujący sposób.

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

Na koniec łączący oba pliki.

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

Program działa następująco:

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