Qt に付属しているような C++ 用のプラットフォームに依存しないリソース システムはありますか (ただし、Qt 依存関係はありません)。
C++ ソース コード内から任意のデータにアクセスしたいと考えています。つまり、アイコンだけでなく、翻訳やシェーダーなども含まれます。
または、たとえば ZIP 圧縮ファイルなどにアクセスするためのある種の仮想ファイル システム ライブラリも、私のニーズに適合します。
Qt に付属しているような C++ 用のプラットフォームに依存しないリソース システムはありますか (ただし、Qt 依存関係はありません)。
C++ ソース コード内から任意のデータにアクセスしたいと考えています。つまり、アイコンだけでなく、翻訳やシェーダーなども含まれます。
または、たとえば ZIP 圧縮ファイルなどにアクセスするためのある種の仮想ファイル システム ライブラリも、私のニーズに適合します。
基本的に一連のファイル (HTML、CSS、JS、PNG など) を取り、.としてエンコードされたデータを含む C++ ヘッダーを作成する C++ Web サーバー プロジェクト用に独自のシステムを作成しました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*
、PITAである64Kbを超えることを許可していません。幸いなことに、これよりも大きなファイルは JavaScript ファイルだけで、小さなチャンクに簡単に分割できました。ただし、大きな画像は問題になります。
この質問xxd
に対する答えは、あなたが探しているものです。
そのためにICU ResourceBundleを使用しており、かなり満足しています。
pkgdata ツールを使用すると、ResourceBundles のパッケージ化は非常に柔軟です。つまり、共有ライブラリ、静的ライブラリ、または ICU によってメモリ マップできるファイルとしてです。
リンク時に実行可能ファイルの最後にバイナリ blob としてパッチを適用しました。最後の 4 バイトが前のブロックのサイズであり、プログラムに末尾からデータ項目を読み取らせます。
より多くのファイルシステムタイプの構造が必要な場合の別のアプローチ (私は試していませんが) は、すべてを zip ファイルに入れ、それを最後に追加することです。ここでも、追加されたデータの簡単に見つけられるサイズが必要になります。