缺少生成的 Valac header
Valac missing generated header
我有两个文件,client.vala
和 lib.vapi
。
VAPI 定义了一个 class(通常会与 C 代码对话):
class Toplevel.Sub.CClass
{
public uint i;
}
而client.vala
使用class:
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
中的函数生成 header。
这是一个错误还是我遗漏了什么?
关于 Vala 编译器,您发现了一些我不知道的事情。 client.h
是编译器在未提供替代项时生成的默认 C header 名称。它使用了源 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
进行编译,您会看到 header 包含为 #include <my_real_c_header.h>
。我个人认为 VAPI 应该与 --pkg
选项一起使用。
如果您从字面上使用 Toplevel.Sub.CClass
到 'usually talk to C code' 那么您就误解了 VAPI 的用途。我认为 'talk to' 是指调用各种 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 了解更多详情。
我有两个文件,client.vala
和 lib.vapi
。
VAPI 定义了一个 class(通常会与 C 代码对话):
class Toplevel.Sub.CClass
{
public uint i;
}
而client.vala
使用class:
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
中的函数生成 header。
这是一个错误还是我遗漏了什么?
关于 Vala 编译器,您发现了一些我不知道的事情。 client.h
是编译器在未提供替代项时生成的默认 C header 名称。它使用了源 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
进行编译,您会看到 header 包含为 #include <my_real_c_header.h>
。我个人认为 VAPI 应该与 --pkg
选项一起使用。
如果您从字面上使用 Toplevel.Sub.CClass
到 'usually talk to C code' 那么您就误解了 VAPI 的用途。我认为 'talk to' 是指调用各种 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 了解更多详情。