【问题标题】:Compile gcrypt for Vala为 Vala 编译 gcrypt
【发布时间】:2016-02-22 05:17:45
【问题描述】:

我正在尝试使用 libgcrypt 的 .vapi 编译在 Vala 中编写的代码。 我在系统中安装了库,并在 c 中运行了一个测试。用 C 编写的代码编译时没有错误: 我输入了以下命令来编译 C 代码:

gcc -o main main.c -l gcrypt

代码运行完美。

但是,以下用 Vala 编写的代码不能使用命令编译:

valac --pkg gcrypt --Xcc=-lgcrypt main.vala

main.vala 是

using GCrypt;
    public static int main(string[] args)
    {
        Hash h;
        Hash.open(out h, Hash.Algorithm.MD5, Hash.Flag.SECURE);
        return 0;
    }

我不知道我做错了什么。

编辑: 很抱歉没有发布错误,但是有:

Loaded package /usr/share/vala-0.30/vapi/glib-2.0.vapi'

Loaded package /usr/share/vala-0.30/vapi/gobject-2.0.vapi'

Loaded package /usr/share/vala-0.30/vapi/gcrypt.vapi'

cc -o '/home/kyul/Documents/Codes/Vala/test_gcrypt/main' '/home/kyul/Documents/Codes/Vala/test_gcrypt/main.vala.c' -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lgobject-2.0 -lglib-2.0 '-lgcrypt' /home/kyul/Documents/Codes/Vala/test_gcrypt/main.vala.c: In function ‘_vala_main’:

/home/kyul/Documents/Codes/Vala/test_gcrypt/main.vala.c:22:38: error: ‘GCRY_MD_FLAGSECURE’ undeclared (first use in this function) gcry_md_open (&_tmp0_, GCRY_MD_MD5, GCRY_MD_FLAGSECURE); ^ /home/kyul/Documents/Codes/Vala/test_gcrypt/main.vala.c:22:38: note: each undeclared identifier is reported only once for each function it appears in error: cc exited with status 256 Compilation failed: 1 error(s), 0 warning(s)

【问题讨论】:

  • 你能说得更具体点吗?错误信息是什么(如果有)?您可以将 -v 传递给 valac 以查看传递给 C 编译器的内容。

标签: c gcc vala libgcrypt


【解决方案1】:

您很可能缺少.vapi 文件。

$ wget https://raw.githubusercontent.com/nemequ/vala-extra-vapis/master/gcrypt.vapi
$ patch < gcrypt.patch
$ valac --vapidir=. --pkg gcrypt --Xcc=-lgcrypt main.vala
$ ./main
$ echo $?
0

我以前从未使用过来自 vala 的 gcrypt api,必须修补 gcrypt.vapi 才能使您的示例正常工作,但修补程序很简单:

--- gcrypt.vapi
+++ gcrypt.vapi
@@ -619,7 +619,7 @@
            public Error get_oid (uchar[] buffer);
        }

-       [CCode (cname = "enum gcry_md_flags", cprefix = "GCRY_MD_FLAG")]
+       [CCode (cname = "enum gcry_md_flags", cprefix = "GCRY_MD_FLAG_")]
        public enum Flag {
            SECURE,
            HMAC

更新:关于您的密码错误,显然 Cipher 类缺少 free_function 映射:

--- a/gcrypt.vapi   2016-02-22 21:40:34.458977385 +0200
+++ b/gcrypt.vapi   2016-02-22 21:39:59.662976449 +0200
@@ -560,7 +560,7 @@
            CBC_MAC   /* Enable CBC message auth. code (MAC). */
        }
        [Compact]
-       [CCode (cname = "gcry_cipher_hd_t", lower_case_cprefix = "gcry_cipher_")]
+       [CCode (cname = "struct gcry_cipher_handle", lower_case_cprefix = "gcry_cipher_", free_function = "gcry_cipher_close")]
        public class Cipher {
            public static Error open (out Cipher cipher, Algorithm algo, Mode mode, Flag flags);
            public void close ();

【讨论】:

  • 就是这样。您的补丁不起作用,但我手动编辑了 .vapi 文件并编译 e 执行成功。但是现在,当我尝试编译以下代码时:using GCrypt.Cipher; public static int main(string[] args) { Cipher c; Cipher.open(out c, Algorithm.AES, Mode.NONE, Flag.secure); return 0; } 我收到以下错误:未定义对'gcry_cipher_free'的引用
  • 非常感谢。 :) 想知道原库中是否有一个叫gcry_free函数的函数对了,我们要更新这个.vapi。
  • @Kyul: 1) AFAIU gcry_cipher_close 进行上下文清理。请参阅docs。 2) AFAIU 您可以提出拉取请求here 或使用 vala 错误跟踪器。干杯!
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 2023-03-23
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2010-10-13
相关资源
最近更新 更多