我有一个使用SDL编写的C++绘图程序。我想仅在Vala中创建一个图形界面,并使用它来调用程序中的函数(这些函数已准备好,我只想从GUI中调用它们)。我正在寻找解决方案,如VAPI,并考虑使用GObject,但我不能同时使用两者。是否有人做过类似的事情,并能为我提供解决问题的建议?
如果您希望在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";
}
当我们准备好之后,可以将Vala代码编译成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 -c cpplibrary.cpp
最后,我们将两个文件链接在一起。
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
-lglib
和-lgobject
在g++中链接两个文件。不幸的是,将来自Vala代码的目标文件与用C++编写的函数链接会返回错误。 - Ocelpersinclude/leveldb/c.h
和db/c.cc
。 - nemequ