Вы обнаружили то, чего я не знал о компиляторе 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 вручную .