実行可能ファイルにファイルを埋め込むのは簡単ですが、いくつかの落とし穴があり、いくつかの移植可能な方法と移植不可能な方法を含むいくつかの方法があります。
イメージを C コードに変換する
画像を定数配列に変換するスクリプトを C で記述します。スクリプトは Python では次のようになります。
#!/usr/bin/env python3
print("static const unsigned char IMAGE_DATA[] = {{{}}};".format(
",".join(str(b) for b in open("myimage.bmp", "rb").read())))
出力をファイルにパイプし、*.h
そのファイルを別のファイルからインクルードするだけです。でファイルのサイズを取得できますsizeof(IMAGE_DATA)
。
利点: ポータブル
短所: Python をインストールする必要がある、コンパイラに対して配列が大きすぎる場合は機能しない、ビルド システムにカスタム ステップを追加する必要がある
画像をオブジェクトファイルに変換
これは、よりプラットフォームに依存します。GNU binutils ツールチェーン (Linux など) を使用できるプラットフォームでは、Microsoft ツールチェーンで動作するobjcopy
と思います。bin2obj
メリット:どこでも使える
短所: 移植性がない、カスタム ステップをビルド システムに追加する必要がある、カスタム ステップを正しく行うのが難しい場合がある
GNU binutils ツールチェーンでは、objcopy を使用
objcopy
プログラムでは入力形式として指定できますがbinary
、アーキテクチャを明示的に指定する必要があります...そのため、実行可能ファイルの i386 および x64 バージョンのコマンドを変更する必要があります。
$ objcopy --input binary --output elf32-i386 --binary-architecture i386 \
myimage.bmp myimage.o
次の宣言を使用して、C からデータを取得できます。
// Ignore the fact that these are char...
extern char _binary_myimage_bmp_start, _binary_myimage_bmp_end;
#define MYIMAGE_DATA ((void *) &_binary_myimage_bmp_start)
#define MYIMAGE_SIZE \
((size_t) (&_binary_myimage_bmp_end - &_binary_myimage_bmp_start))
アセンブラ ディレクティブを使用する
逆説的に、静的ファイルの埋め込みはアセンブラーではかなり簡単です。アセンブラーには、.incbin
(GAS と YASM で動作する) のようなディレクティブがあることがよくあります。
メリット:どこでも使える
短所: 移植性がなく、アセンブラーの構文がプラットフォーム間で異なる
(Windows) ファイルをリソースとして埋め込む
Windows では、リソースを EXE に埋め込んでから、ライブラリ呼び出しを使用してリソースを取得できます。
利点: Windows を使用している場合はおそらく最も簡単です
短所: Windows でしか動作しない