Vala GUI和C++逻辑

9

我有一个使用SDL编写的C++绘图程序。我想仅在Vala中创建一个图形界面,并使用它来调用程序中的函数(这些函数已准备好,我只想从GUI中调用它们)。我正在寻找解决方案,如VAPI,并考虑使用GObject,但我不能同时使用两者。是否有人做过类似的事情,并能为我提供解决问题的建议?


你为什么认为你不能将基于GObject的API与VAPI绑定?大多数可用的VAPI都是这样做的... - nemequ
我尝试将Vala代码编译成C并创建一个目标文件。我从C++代码创建了一个目标文件。然后我尝试使用-lglib-lgobject在g++中链接两个文件。不幸的是,将来自Vala代码的目标文件与用C++编写的函数链接会返回错误。 - Ocelpers
你能把错误信息发到这里吗? - MrEricSir
1
你不能直接将Vala代码链接到C++,但为C++代码创建一个C包装器通常非常简单。您只需要注意使用C链接来公开要暴露给C / Vala的符号即可。如果您想要一个示例,请查看leveldb源代码。具体来说,请参阅include/leveldb/c.hdb/c.cc - nemequ
1
如果您正在使用C++链接,那么您很可能会看到该错误。请确保在适当的情况下使用extern "C"。http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B.2B_code - nemequ
显示剩余3条评论
1个回答

23

如果您希望在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接