【问题标题】:Valac missing generated headerValac 缺少生成的标头
【发布时间】:2018-05-18 16:19:18
【问题描述】:

我有两个文件,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 中的函数生成一个头文件。

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

【问题讨论】:

  • 你想用那个 vapi 文件实现什么?您想从 Vala 代码中访问其他 C 库吗? Vapi 文件仅用作 valac 读取的占位符,对 C 编译器没有用处,因为它未翻译成 C 代码。因此,C 编译器不知道class Toplevel.Sub.CClass。因此,您还应该将该库附带的 C 头文件提供给编译器,例如,将其放入您的构建目录中。

标签: header-files vala vapi


【解决方案1】:

你发现了一些我不知道的关于 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 来“通常与C 代码交谈”,那么您误解了VAPI 的用途。我认为“交谈”是指调用各种 C 函数并收集结果,以便它们可以以对 Vala 更友好的方式呈现给程序的其余部分。所以它是一个包装接口。

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

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

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

查看Writing a VAPI Manually了解更多详情。

【讨论】:

  • 谢谢@AIThomas -- 我将代码修改为实际调用 C 函数,在遇到同样的错误后,指定cheader_filename 就成功了。对于面临同样问题的其他人,现在可以使用的代码是here
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2015-04-12
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多