Vala GUI 和 C++ 中的逻辑

Posted

技术标签:

【中文标题】Vala GUI 和 C++ 中的逻辑【英文标题】:Vala GUI and logic in C++ 【发布时间】:2013-05-28 22:12:22 【问题描述】:

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

【问题讨论】:

是什么让您认为您不能将基于 GObject 的 API 与 VAPI 绑定? 大部分可用的 VAPI 就是这样做的... 我尝试将 Vala 代码编译为 C,然后创建一个目标文件。我从 C++ 代码创建了一个目标文件。然后我尝试在 g++ 中用-lglib-lgobject 链接两个文件。不幸的是,将 Vala 代码中的对象与用 C++ 编写的函数链接会返回错误。 你能把错误贴在这里吗? 您不能将 Vala 代码直接链接到 C++,但是为 C++ 代码创建一个 C 包装器通常非常简单。您只需要注意将 C 链接用于要公开给 C/Vala 的符号。如果您想要一个示例,请查看 leveldb 源代码。具体来说,include/leveldb/c.hdb/c.cc 如果您使用 C++ 链接,您可能会看到该错误。确保在适当的时候使用 extern "C"。 en.wikipedia.org/wiki/… 【参考方案1】:

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

【讨论】:

以上是关于Vala GUI 和 C++ 中的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

处理 GUI 应用程序中的复杂规则(C++ 或 C#)

与 C++ 相比,Vala 是一种理智的解析语言吗?

C++ 的替代语法,Vala 的精灵?

从 C++ 中的 gui 内创建的对象修改 GUI

如何访问 Vala 中的环境变量?

Vala 中的通用函数