Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Vala vapi文件文档_C_Glib_Vala_Vapi - Fatal编程技术网

C Vala vapi文件文档

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代

我想使用Vala来破解一个现有的基于GLib的C项目

基本上,我正在做的是,在构建过程的开始,使用valac从.vala文件生成.c和.h文件,然后以编译任何.c或.h文件的方式编译生成的文件

这可能不是最好的方法,但在大多数情况下似乎都很有效

我的问题是,我很难从Vala代码访问现有的C代码。有没有一个简单的方法可以做到这一点

我曾尝试编写自己的.vapi文件(我没有使用vala附带的工具),但我找不到任何关于如何编写这些文件的合适文档


是否存在任何问题?我需要这些文件中的一个来调用现有的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);