Файл не найден при использовании g_resource_lookup_data()

Вопрос или проблема

Я пытаюсь получить доступ к файлу, который был скомпилирован в GResource с помощью gnome.compile_resources() в Meson. Мне удалось успешно получить сгенерированные исходные файлы, и #include "shader-resources.h" работает, а также нет ошибок от shader_resources_get_resource(). Однако, при попытке получить какие-либо данные g_resource_lookup_data выдает ошибку: “Ресурс по адресу “org/lyra/core/default.vert” не существует”.

Использую ли я неправильный формат для пути к файлу или есть что-то еще, чего я не понимаю?

Соответствующий код на C++: (shader_resources — это static GResource*, определенный в отдельном заголовочном файле)

// проверьте, существует ли shader_resources, создайте, если нет
if(shader_resources == nullptr) {
    shader_resources = shader_resources_get_resource();

    // вывод содержимого default.vert
    GError* err = NULL;
    GBytes* data = g_resource_lookup_data(shader_resources, "org/lyra/core/default.vert", G_RESOURCE_LOOKUP_FLAGS_NONE, &err);
    if (err != NULL) {
        g_assert (data == NULL);
        fprintf (stderr, "Не удалось прочитать файл: %s\n", err->message);
        g_error_free (err);
    }
    std::printf("%s", data);
    g_bytes_unref(data);
}

org.lyra.core.gresource.xml:

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/org/lyra/core">
  
    <file compressed="true">default.vert</file> 
    <file compressed="true">default.vert.spv</file> 
    <file compressed="true">default.frag.spv</file> 
    
  </gresource>
</gresources>

В моей meson.build:

shader_resources = gnome.compile_resources(
    'shader-resources',
    'org.lyra.core.gresource.xml', 
    c_name:'shader_resources',
    dependencies:shader_sources
)

Функция g_resource_lookup_data() в GLib используется для извлечения данных, встроенных в файл GResource. Если вы получаете ошибку “Файл не найден”, это может быть вызвано несколькими причинами. Вот контрольный список, который поможет вам устранить неполадки:

  1. Конфигурация XML ресурса: Убедитесь, что файл, к которому вы пытаетесь получить доступ, правильно определён в файле .gresource.xml. Например:

    <gresources>
      <gresource prefix="/com/your/app">
        <file>path/to/your/file</file>
      </gresource>
    </gresources>
    
  2. Правильный префикс пути: При использовании g_resource_lookup_data() убедитесь, что путь, который вы используете, совпадает с префиксом в XML-файле. Например:

    g_resource_lookup_data("/com/your/app/path/to/your/file", G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
    
  3. Компиляция ресурсов: Убедитесь, что ваш файл ресурсов (.gresource.xml) был скомпилирован правильно с помощью glib-compile-resources. Команда должна сгенерировать .c файл, который включает данные. Например:

    glib-compile-resources your.gresource.xml
    
  4. Регистрация ресурса: Прежде чем вы сможете получить доступ к ресурсам, вам нужно зарегистрировать GResource во время выполнения с помощью g_resources_register(). Например:

    GResource *resource = g_resource_load("your.gresource", &error);
    g_resources_register(resource);
    
  5. Ссылка на ресурс в сборке: Убедитесь, что скомпилированный файл ресурса правильно связан в вашей системе сборки (например, Makefile, Meson и т. д.).

  6. Чувствительность к регистру: Пути к ресурсам чувствительны к регистру. Убедитесь, что путь, который вы указываете, точно соответствует названиям файлов и пути, указанному в XML.

Сообщите мне, если какой-либо из этих шагов решит вашу проблему, или если вам нужна дальнейшая помощь!

Похоже, вы пропускаете начальный слэш в пути поиска:

GBytes* data = g_resource_lookup_data(shader_resources, "/org/lyra/core/default.vert", G_RESOURCE_LOOKUP_FLAGS_NONE, &err);

вместо

GBytes* data = g_resource_lookup_data(shader_resources, "org/lyra/core/default.vert", G_RESOURCE_LOOKUP_FLAGS_NONE, &err);

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что функция g_resource_lookup_data() не может найти ресурс, который вы пытаетесь запросить. Ошибка "Файл не найден" может возникать по ряду причин. Вот несколько шагов, которые помогут вам устранить эту проблему:

  1. Проверка конфигурации XML ресурсов: Убедитесь, что файл, который вы пытаетесь получить, правильно определён в файле .gresource.xml. Пример правильной конфигурации:

    <gresources>
     <gresource prefix="/org/lyra/core">
       <file compressed="true">default.vert</file>
     </gresource>
    </gresources>
  2. Правильный путь к ресурсу: Убедитесь, что вы используете корректный путь при вызове функции g_resource_lookup_data(). Путь должен начинаться с символа / и соответствовать префиксу в XML-файле:

    GBytes* data = g_resource_lookup_data(shader_resources, "/org/lyra/core/default.vert", G_RESOURCE_LOOKUP_FLAGS_NONE, &err);
  3. Компиляция ресурсов: Убедитесь, что ваш файл ресурсов (.gresource.xml) был правильно скомпилирован с помощью glib-compile-resources. Проверьте, что команда для компиляции выполняется без ошибок:

    glib-compile-resources org.lyra.core.gresource.xml
  4. Регистрация ресурсов: Перед тем как вы сможете получать доступ к ресурсам, необходимо зарегистрировать GResource во время выполнения. Используйте функцию g_resources_register(), как показано ниже:

    GResource *resource = g_resource_load("org.lyra.core.gresource", &err);
    g_resources_register(resource);
  5. Связывание ресурсов в сборке: Убедитесь, что скомпилированный файл ресурсов правильно связан в вашей системе сборки (например, в Meson или Makefile).

  6. Чувствительность к регистру: Обратите внимание, что пути к ресурсам чувствительны к регистру. Убедитесь, что вы вводите имя файла и путь точно так же, как они указаны в XML-файле.

  7. Отладка: Если ошибка продолжает возникать, рекомендуется временно добавить дополнительные выводы, чтобы понять, каким образом регистрируются и извлекаются ресурсы. Это может помочь вам понять, на каком именно этапе происходит сбой.

Таким образом, исправив путь на правильный с ведущим слэшем, вы сможете устранить проблему "Файл не найден". Пример исправленного кода:

GBytes* data = g_resource_lookup_data(shader_resources, "/org/lyra/core/default.vert", G_RESOURCE_LOOKUP_FLAGS_NONE, &err);

Если у вас возникнут дополнительные вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...