链接器无法从 json-glib 中找到 'get_int_member_with_default'

Linker can't find 'get_int_member_with_default' from json-glib

我目前正在开发一个与 REST 交互的库 API。此 API 以 JSON 对象响应,我正在使用 json-glib-1.0 对其进行解析。由于对象的某些成员可能不存在,我想使用 Json.Object class 的 get_x_member_with_default 函数。 即使 Vala 和 C 编译器都能看到这些函数,linker 还是给我几个错误:

Undefined symbols for architecture x86_64:
  "_json_object_get_boolean_member_with_default", referenced from:
      _discord_message_construct in message-f5c60f.o
  "_json_object_get_int_member_with_default", referenced from:
      _discord_message_construct in message-f5c60f.o
  "_json_object_get_string_member_with_default", referenced from:
      _discord_message_construct in message-f5c60f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

要重现此内容,您可以尝试以下代码:

void main() {
    string json = "{\"one\": 1337}";
    Json.Parser parser = new Json.Parser();
    parser.load_from_data(json, -1);
    int64 val = parser.get_root().get_object().get_int_member_with_default("one", 666);
    stdout.printf(@"$val\n");
}

并使用此命令编译它:valac --pkg json-glib-1.0 file.vala。 这给了我

Undefined symbols for architecture x86_64:
  "_json_object_get_int_member_with_default", referenced from:
      __vala_main in json2-ec99c2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这显然不是图书馆;编译我的库时,我只生成 C 代码并编译和 link 输出 pkg-config --cflags --libs json-glib-1.0 的所有内容。我还需要 link 吗?

您需要安装更新版本的 json-glib,或者更有可能的是,不要使用该符号。 Vala documentation for the symbol shows this is since version 1.6 of the library. This information is taken from the C source for the library and the symbol was added with this commit. The problem is the latest stable release appears to be 1.4.4 - see the source repository tags。所以看起来你必须用最新的符号构建你自己的开发版本或者不使用 get_int_member_with_default ().