Valac缺少生成的标题

时间:2018-05-18 16:19:18

标签: header-files vala vapi

我有两个文件,client.valalib.vapi VAPI定义了一个类(通常与C代码对话):

class Toplevel.Sub.CClass
{
    public uint i;
}

client.vala使用了这个类:

class Toplevel.Sub.UserClass
{
    public Toplevel.Sub.CClass c_class;
}

int main()
{
    var cls = new Toplevel.Sub.UserClass();
    cls.c_class.i = 0;
    return 0;
}

当我尝试编译程序时,出现错误:

$ valac client.vala lib.vapi
/tmp/bug/client.vala.c:7:20: fatal error: client.h: No such file or directory
compilation terminated.
error: cc exited with status 256
Compilation failed: 1 error(s), 0 warning(s)

编译器似乎想要为client.vala

中的函数生成标头

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:3)

您已经发现了一些我对Vala编译器一无所知的事情。 client.h是编译器在没有提供替代项时生成的默认C头名称。它使用了源Vala文件的基名。您可以使用cheader_filename CCode详细信息更改此设置。将您在VAPI中拥有的内容更改为:

[CCode (cheader_filename = "my_real_c_header.h")]
class Toplevel.Sub.CClass
{
    public uint i;
}

您将看到包含现在为#include "my_real_c_header.h"

顺便说一下,如果使用valac client.vala --vapididr . --pkg lib进行编译,您会看到标题包含在#include <my_real_c_header.h>中。我个人认为VAPI应该与--pkg选项一起使用。

如果您确实使用Toplevel.Sub.CClass来&#39;通常与C代码对话&#39;然后你误解了VAPI的目的。我采取与#39;交谈表示调用各种C函数并收集结果,以便它们可以以更加Vala友好的方式呈现给您的程序的其余部分。所以它是一个包装器接口。

VAPI包含Vala编译器将名称转换为C接口的正确名称的指令。例如,您可能希望在Vala中使用非常简单的C函数void top_level_do_something ()。在Vala中,它有助于使用命名空间,因此VAPI可以是:

[CCode (cheader_filename = "my_real_c_header.h")]
namespace TopLevel {
    [CCode (cname = "top_level_do_something")]
    public void do_something ();
}

然后您可以使用TopLevel.do_something ()在Vala中调用它,编译器会在C中将其写为top_level_do_something ()

请查看Writing a VAPI Manually了解详情。