Valac отсутствует сгенерированный заголовок - PullRequest
0 голосов
/ 18 мая 2018

У меня есть два файла, client.vala и lib.vapi.
VAPI определяет класс (который обычно говорит с кодом C):

class Toplevel.Sub.CClass
{
    public uint i;
}

И client.vala использует класс:

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.

Это ошибка или я что-то упустил?

1 Ответ

0 голосов
/ 18 мая 2018

Вы обнаружили то, чего я не знал о компиляторе Vala.client.h - это имя заголовка C по умолчанию, генерируемое компилятором, когда альтернативы не предоставлено.Он использовал базовое имя исходного файла 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, вы увидите заголовоквключен как #include <my_real_c_header.h>.Лично я считаю, что VAPI следует использовать с опцией --pkg.

Если вы буквально используете Toplevel.Sub.CClass для «обычного общения с кодом C», то вы неправильно поняли цель VAPI.Я имею в виду «говорить с», чтобы означать вызов различных функций Си и сбор результатов, чтобы они могли быть представлены в более дружественной для 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 (), и компилятор записал бы это как top_level_do_something () в C.

Для получения более подробной информации смотрите Написание VAPI вручную .

...