2013-06-02 26 views
5

我有一個使用SDL編寫的繪圖程序,用C++編寫。我只想在Vala中創建一個圖形界面,並使用它來調用程序中的函數(函數可以使用,我只想從GUI調用它們)。我正在尋找解決方案作爲VAPI,並且我正在考慮使用GObject,但我不能同時擁抱這兩者。有沒有人做過類似的事情,你能建議我解決我的問題嗎?Vala GUI和C++中的邏輯

+0

是什麼讓你認爲你不能綁定在VAPI基於GObject的-API? *大多數可用的VAPI都是這樣做的...... – nemequ

+0

我試圖將Vala代碼編譯爲C,然後創建一個目標文件。我從C++代碼創建了一個對象文件。然後我試着用g ++中的'-lglib'和'-lgobject'連接兩個文件。不幸的是,將Vala代碼中的對象與用C++編寫的函數鏈接會返回錯誤。 – Ocelpers

+0

你能在這裏發佈錯誤嗎? – MrEricSir

回答

13

如果您想在Vala中使用C++代碼,我們會準備好它們。這是一個例子。

首先你必須告訴valac編譯器該函數是在其他地方定義的。我們使用extern指令。

// ccodetest.vala 
extern void cpp_test_function(); 

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

然後++正確地與衍生自C目標文件鏈接在C中的功能,我們將它們聲明爲的extern「C」

// cpplibrary.cpp 
# include 

using namespace std; 

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

當我們這樣準備好了,我們可以編譯瓦拉代碼爲C.我們得到ccodetest.c。現在

valac -C ccodetest.vala

我們可以使用gcc編譯對象文件。我們得到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/

文件C++編譯如下。

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

最後我們連接這兩個文件。

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

程序的工作原理如下:

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