1. ホーム
  2. c++

[解決済み] GCC による C/C++: 実行ファイル/ライブラリへのリソースファイルの静的追加

2023-01-17 09:59:57

質問

GCC を使って、リソースファイルを実行ファイルや共有ライブラリファイルに静的にコンパイルする方法をご存知の方はいらっしゃいますか?

たとえば、私は決して変更されない (そして、もし変更されたら、どのみちファイルを交換しなければならない) 画像ファイルを追加したいのですが、それらをファイルシステムで寝かせておきたくありません。

これが可能であるなら (Windows 用 Visual C++ もこれを行うことができるので、私はそう思います)、自身のバイナリに格納されているファイルをどのようにロードすることができますか。実行ファイルが自分自身をパースし、ファイルを見つけ、そこからデータを抽出するのでしょうか?

もしかしたら、私がまだ見ていない GCC のためのオプションがあるかもしれません。検索エンジンを使用しても、本当に正しいものを吐き出すことはできませんでした。

私は、これが共有ライブラリと通常の ELF 実行可能ファイルのために動作することを必要とします。

どのように解決するのですか?

とは imagemagick :

convert file.png data.h

のようなものを与える。

/*
  data.h (PNM).
*/
static unsigned char
  MagickImage[] =
  {
    0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 
    0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 
    0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 

....

他のコードとの互換性を保つために、この後 fmemopen で、"regular"を取得します。 FILE * オブジェクト、またはその代わりに std::stringstream を作るには iostream . std::stringstream はあまり良いものではありませんが、もちろんイテレータが使えるところならどこでもポインタを使えばいいのです。

automake でこれを使う場合、忘れずに BUILT_SOURCES を設定します。 を適切に設定してください。

この方法のいいところは

  1. テキストを出力するので、バージョン管理やパッチを感覚的に行うことができる
  2. 移植性が高く、どのプラットフォームでもうまく定義できる