vala - 如何将 Vala 编译为 C 并调用另一个文件中的函数,该文件最初是用 C 编写的并全部编译?
问题描述
似乎没有关于与最初用 C 编写的 C 源代码互操作的文档。
或者,最好从 vala 代码创建一个库并从我的 C 程序中调用它?
似乎回答了我的问题,我会在几个小时内检查。
解决方案
这是一个非常简单的例子。将以下 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 文件。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 预处理器指令。而是my_function
在 C 文件本身中声明。可以再次编写接口文件,这次是 C 头文件而不是 VAPI 文件。然后您必须[CCode(cheader_filename = "my_header.h")]
在 VAPI 中使用,以便 Vala 生成#include
.
推荐阅读
- javascript - 在 md 文件中查找语法错误的 gulp 任务
- java - 如何在文件行出现并将它们表示为 Flux 时读取它们?
- c# - C# 继承 ArrayList 类和自定义方法来查询自身
- javascript - Auth0 Angular 7 登录重定向循环
- javascript - 变量返回假,即使它显然是真的
- python - Python re.sub 不替换换行符
- java - OneToMany 列在创建条目时未更新
- ruby-on-rails - Rails:发布参数为空
- bootloader - PIC24FJ128GC006的Flash烧写问题
- python-3.x - CodeRunner 错误 - 在代码执行之前未激活虚拟环境