为libui创建vala绑定(vapi)时出现问题

时间:2019-01-09 13:15:06

标签: vala vapi

我正在尝试编写一个VAPI文件以在Vala中使用libui(https://github.com/andlabs/libui)。 这是我的第一次尝试:

[CCode (cheader_filename = "ui.h")]
namespace LibUi {

[CCode (cname = "uiInitOptions", cprefix = "ui", has_type_id = false)]
public struct uiInitOptions {
    size_t Size;
}

[CCode (cname = "uiInit", has_type_id = false)]
public char uiInit(uiInitOptions options);
[CCode (cname = "uiMain", has_type_id = false)]
public void uiMain();
[CCode (cname = "uiQuit", has_type_id = false)]
public void uiQuit();
}

这是vala中的测试代码:

using LibUi;

public static int main (string[] args) {
uiInitOptions o = uiInitOptions();
uiInit(o);
return 0;
}

使用“ valac --vapidir。--pkg libui main.vala”进行编译
带来此错误:
main.vala.c :(。text + 0x3c):未定义对“ uiInit”的引用

在libui的示例C代码中是这样:

int main(void)
{
uiInitOptions o;
const char *err;
memset(&o, 0, sizeof (uiInitOptions));
err = uiInit(&o);
...
}

我该如何在vala中制作此内存集或将其构建到vapi文件中?

1 个答案:

答案 0 :(得分:1)

关于未定义引用的第一个问题:

据我所知,

libui没有为pkg-config提供libui.pc文件。因此,您必须像这样告诉vala编译器链接libui.so库:

valac --vapidir . --pkg libui -X -lui main.vala

现在是关于记忆集的第二个问题:

您不必将内存归零,无论如何,valac都会自动执行此操作。您可以在生成的代码中看到该代码:

valac --vapidir . --pkg libui -C main.vala

那里有一个记忆集:

gint _vala_main (gchar** args, int args_length1) {
    gint result = 0;
    uiInitOptions o = {0};
    uiInitOptions _tmp0_;
    memset (&o, 0, sizeof (uiInitOptions));
    _tmp0_ = o;
    uiInit (&_tmp0_);
    result = 0;
    return result;
}

PS:您可能希望摆脱vapi文件中的ui *前缀,而改用名称空间。