C Vala vapi文件文档
我想使用Vala来破解一个现有的基于GLib的C项目 基本上,我正在做的是,在构建过程的开始,使用valac从.vala文件生成.c和.h文件,然后以编译任何.c或.h文件的方式编译生成的文件 这可能不是最好的方法,但在大多数情况下似乎都很有效 我的问题是,我很难从Vala代码访问现有的C代码。有没有一个简单的方法可以做到这一点 我曾尝试编写自己的.vapi文件(我没有使用vala附带的工具),但我找不到任何关于如何编写这些文件的合适文档C Vala vapi文件文档,c,glib,vala,vapi,C,Glib,Vala,Vapi,我想使用Vala来破解一个现有的基于GLib的C项目 基本上,我正在做的是,在构建过程的开始,使用valac从.vala文件生成.c和.h文件,然后以编译任何.c或.h文件的方式编译生成的文件 这可能不是最好的方法,但在大多数情况下似乎都很有效 我的问题是,我很难从Vala代码访问现有的C代码。有没有一个简单的方法可以做到这一点 我曾尝试编写自己的.vapi文件(我没有使用vala附带的工具),但我找不到任何关于如何编写这些文件的合适文档 是否存在任何问题?我需要这些文件中的一个来调用现有的C代
是否存在任何问题?我需要这些文件中的一个来调用现有的C代码吗?是的,要调用C函数,需要为它编写一个绑定。中描述了该过程,但是,这并不直接适用于未使用GObject编写的自定义函数或库。如果您对非GObject库有复杂的绑定,您可能需要#vala IRC channel的帮助 然而,大多数情况下,我们使用简单的vapi文件绑定一些autoconf define或一些用普通C编写的函数,以提高效率或破坏vala,或其他任何原因。大多数人都是这样做的: myfunc.vapi
[CCode (cheader_filename = "myfunc.h")]
namespace MyFunc {
[CCode (cname = "my_func_foo")]
public string foo (int bar, Object? o = null);
}
myfunc.h(以及与项目链接的a.c中的相应实现)
使用valac编译时,使用
--vapidir=
给出myfunc.vapi的目录位置。根据您的构建系统,您可能需要向valac或gcc CFLAGS传递额外的参数,以便将所有内容链接在一起。对于elmarco的答案,我唯一要添加的是extern
关键字。如果您试图访问某个软件包或标准C/Posix库中已有的单个C函数,则可以通过这种方式轻松访问该函数。仅从C访问vala代码可能会更容易。由于您只需编译到C即可。对于用C编写的基于GLib的库,您可以尝试从C源生成gir文件:
手动操作也没有问题。假设您有一个库,它使用一个名为do_something的方法在C中定义SomelibClass1,该方法使用字符串。
头文件的名称是“somelib.h”。相应的vapi如下所示:
somelib.vapi:
[CCode (cheader_filename="somelib.h")]
namespace Somelib {
public class Class1 {
public void do_something (string str);
}
}
为非GLib库编写VAPI的文档可在以下位置找到:
这其实很容易。让我们摘自posix.vapi:
[Compact]
[CCode (cname = "FILE", free_function = "fclose", cheader_filename = "stdio.h")]
public class FILE {
[CCode (cname = "fopen")]
public static FILE? open (string path, string mode);
[CCode (cname = "fgets", instance_pos = -1)]
public unowned string? gets (char[] s);
}
这将实现以下C功能:
FILE *fopen (const char *path, const char *mode);
char *fgets (char *s, int size, FILE *stream);
当丢弃instance_pos属性时,vala假设对象是方法的第一个参数。通过这种方式,可以绑定大致面向对象的c结构。当对象被取消引用时,将调用compact类的free_方法
方法、类、结构等的CCode(cname)-属性必须是它的名称,就像在C中一样
这个主题还有很多内容,但这应该能让你大致了解一下。谢谢!我遇到的一个问题是,当我在myfunc.vapi中指定头文件时,valac的.c输出会写入#include,而我真正想要的是#include“myfunc.h”。你知道怎么解决这个问题吗?它可以解决吗?这应该不是什么大问题,只要文件没有安装在您的系统include中,它就会在您的项目目录中打开,如果您为路径提供-I。。(示例:-I$(topsrc\U dir)/libfoo)
[Compact]
[CCode (cname = "FILE", free_function = "fclose", cheader_filename = "stdio.h")]
public class FILE {
[CCode (cname = "fopen")]
public static FILE? open (string path, string mode);
[CCode (cname = "fgets", instance_pos = -1)]
public unowned string? gets (char[] s);
}
FILE *fopen (const char *path, const char *mode);
char *fgets (char *s, int size, FILE *stream);