如何将Vala编译为C,并在另一个最初用C编写的文件中调用函数,然后将其全部编译?

时间:2019-08-31 01:01:38

标签: vala

似乎没有关于与最初用C语言编写的C源代码互操作的文档。

还是更好的方法是仅使用vala代码创建一个库并从我的C程序中调用它?

How can I import other files in Vala?

似乎可以回答我的问题,我会在几小时后检查。

1 个答案:

答案 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