似乎没有关于与最初用C语言编写的C源代码互操作的文档。
还是更好的方法是仅使用vala代码创建一个库并从我的C程序中调用它?
How can I import other files in Vala?
似乎可以回答我的问题,我会在几小时后检查。
答案 0 :(得分:0)
这是一个非常简单的示例。将以下C代码另存为名为a.c
#include <stdio.h>
void my_function() {
printf("I am a function written in a C file\n");
}
将以下Vala代码保存为名为b.vala
的文件
extern void my_function ();
void main() {
my_function();
}
然后使用以下代码进行编译:
valac a.c b.vala --output demo
这里的幕后发生了很多事情。 valac
完成了工作,但是像Meson这样的构建系统更适合将要增长的项目。
第一个valac
识别列表中的Vala文件并将其编译为C。extern void my_function ();
告知Vala编译器my_function
是在外部定义的,而不是在任何Vala源文件中定义的给定的。 Vala编译器仅需要函数签名即可对来自Vala的所有调用进行类型检查,并在生成的C文件中声明函数。而不是将extern
放在可以写入接口文件的每个位置。在Vala中,这是VAPI file。 VAPI将Vala符号到C符号的翻译信息保留在一个位置,从而有助于项目的可维护性和可读性。
第二valac
将给定的C文件和生成的C文件传递给C编译器。 C编译器将文件编译为目标文件,然后调用链接器以构建单个二进制文件。如果查看生成的C文件,这可能会更清楚。使用:
valac a.c b.vala --output demo --save-temps
生成的C文件b.c
如下所示:
/* b.c generated by valac 0.43.6.15-63bd-dirty, the Vala compiler
* generated from b.vala, do not modify */
void my_function (void);
void _vala_main (void);
void
_vala_main (void)
{
my_function ();
}
int
main (int argc,
char ** argv)
{
_vala_main ();
return 0;
}
没有使用#include
C预处理程序指令。而是在C文件本身中声明my_function
。同样,可以写入一个接口文件,这次是C头文件,而不是VAPI文件。然后,您将不得不在VAPI中使用[CCode(cheader_filename = "my_header.h")]
,这样Vala才能生成#include
。