2013-06-02 7 views
5

C++で書かれたSDLを使用する描画プログラムがあります。私はValaでのみグラフィカルインターフェイスを作成し、プログラムから関数を呼び出すために使用したいと考えています(関数は使用準備ができており、GUIから呼び出したいだけです)。私はVAPIとしてソリューションを探していましたが、私はGObjectの使用を考えていましたが、私は両方を受け入れることはできません。誰もが似たようなことをやったことがありますか、私の問題に対する解決策を提案できますか?C++のVala GUIとロジック

+0

あなたはVAPIでのGObjectベースのAPIをバインドすることはできませんだと思いますか? *利用可能なVAPIの大半はそれだけです... – nemequ

+0

私はValaコードをCにコンパイルし、オブジェクトファイルを作成しようとしました。私はC++コードからオブジェクトファイルを作成しました。そして、g ++の '-lglib'と' -lgobject'で2つのファイルをリンクしようとしました。残念ながら、オブジェクトを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"; 
} 

我々は準備ができているとき、私たちは私たちがccodetest.cを取得するC.にValaのコードをコンパイルすることができます。

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