Die*_*Epp 14
在可执行文件中嵌入文件很容易,但有一些问题,有几种方法可以做到这一点,包括一些便携式和非便携式方式.
编写一个脚本将图像转换为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())))
Run Code Online (Sandbox Code Playgroud)
只需将输出传递给一个*.h文件,并将该文件包含在另一个文件中.你可以用它来获取文件的大小sizeof(IMAGE_DATA).
优点:便携
缺点:需要安装Python,如果数组太大而无法编译,则无法工作,需要向构建系统添加自定义步骤
这更依赖于平台.在使用GNU binutils工具链(例如Linux)的平台上,您可以使用objcopy,我认为可以使用bin2objMicrosoft工具链.
优点:无处不在
缺点:不可移植,需要向构建系统添加自定义步骤,自定义步骤可能很难实现
该objcopy程序允许您指定binary输入格式,但是您需要明确指定体系结构...因此您必须修改i386和x64版本的可执行文件的命令.
$ objcopy --input binary --output elf32-i386 --binary-architecture i386 \
myimage.bmp myimage.o
Run Code Online (Sandbox Code Playgroud)
您可以使用以下声明从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))
Run Code Online (Sandbox Code Playgroud)
矛盾的是,在汇编程序中嵌入静态文件相当容易.汇编程序通常具有类似指令.incbin(与GAS和YASM一起使用).
优点:无处不在
缺点:不可移植,汇编语法在平台之间是不同的
在Windows上,您可以将资源嵌入EXE中,然后使用库调用获取资源.
优点:如果你在Windows上,可能最简单
缺点:仅适用于Windows