Независимая от платформы система ресурсов (например, система Qt Resource) - PullRequest
6 голосов
/ 15 декабря 2009

Существует ли независимая от платформы система ресурсов для C ++, подобная той, которая поставляется с Qt (но без зависимости Qt)?

Я хотел бы получить доступ к произвольным данным из моего исходного кода C ++. То есть не только иконки, но и переводы или шейдеры и т. Д.

В качестве альтернативы какая-то библиотека виртуальной файловой системы для доступа, например, ZIP-сжатый файл или что-то подобное также подходит для моих нужд.

Ответы [ 4 ]

9 голосов
/ 15 декабря 2009

Я развернул свою собственную систему для проекта веб-сервера C ++, который в основном взял несколько файлов (HTML, CSS, JS, PNG и т. Д.) И создал заголовки C ++, содержащие данные, закодированные как static const char*. Затем я #include те заголовки, где мне нужен доступ к данным. Приложение, которое кодирует файлы ресурсов, выполняется как предварительный этап сборки. Само приложение кодирования использовало boost::filesystem для создания заголовков ресурсов, поэтому работает в Windows / * nix.

Типичный файл ресурсов может выглядеть так:

namespace resource
{
  // Generated from mainPage.htm
  static const char* mainPage_[] =
  {
    "<html>...</html>"
  };
}

Для двоичного содержимого я кодирую, используя обозначение \x. Я также проверяю, чтобы данные были перенесены в строку, чтобы их можно было прочитать в редакторе.

У меня действительно были некоторые проблемы - компилятор MS не позволяет static const char* быть больше, чем 64Kb, который был PITA. К счастью, единственными файлами, которые были больше этого размера, были файлы JavaScript, которые я мог легко разделить на более мелкие фрагменты - хотя большие изображения были бы проблемой.

1 голос
/ 06 июля 2010

Ответ xxd на этот вопрос - это то, что вы ищете.

0 голосов
/ 18 января 2010

Я только что залатал их в конец исполняемого файла во время соединения в виде двоичного двоичного объекта. Последние 4 байта равны размеру предыдущего блока, а затем программа считывает элементы данных из хвоста.

Другим подходом, если вам нужна структура типа файловой системы (хотя я не пробовал), было бы поместить все в zip-файл и добавить его в конец. Опять же, вам понадобится легко найти размер добавленных данных.

0 голосов
/ 18 января 2010

Мы используем ICU ResourceBundle s для этого и очень довольны.

Используя инструмент pkgdata , упаковка ResourceBundles довольно гибкая: в качестве разделяемой библиотеки, статической библиотеки или в виде файлов, которые могут быть отображены в памяти ICU.

...