#include <stdio.h>
// a file named foo.bar with some example text is 'imported' into
// an object file using the following command:
//
// ld -r -b binary -o foo.bar.o foo.bar
//
// That creates an bject file named "foo.bar.o" with the following
// symbols:
//
// _binary_foo_bar_start
// _binary_foo_bar_end
// _binary_foo_bar_size
//
// Note that the symbols are addresses (so for example, to get the
// size value, you have to get the address of the _binary_foo_bar_size
// symbol).
//
// In my example, foo.bar is a simple text file, and this program will
// dump the contents of that file which has been linked in by specifying
// foo.bar.o as an object file input to the linker when the progrma is built
extern char _binary_foo_bar_start[];
extern char _binary_foo_bar_end[];
int main(void)
{
printf( "address of start: %p\n", &_binary_foo_bar_start);
printf( "address of end: %p\n", &_binary_foo_bar_end);
for (char* p = _binary_foo_bar_start; p != _binary_foo_bar_end; ++p) {
putchar( *p);
}
return 0;
}
对于C23,现在有预处理器指令#embed,它不需要使用外部工具就能达到你想要的效果。参见6.10.3.1的C23标准(这里有一个最新working draft的链接)。这里是good blog post关于#embed的历史,是这个新特性背后的一个委员会成员写的。 以下是标准草案的一个片段,演示了它的用途:
6条答案
按热度按时间dsf9zpds1#
有几种可能性:
bin2c
/bin2h
实用工具将任何文件转换为字节数组(将图像嵌入代码中,而不使用资源节或外部图像)更新:下面是一个更完整的示例,说明如何使用
ld -r -b binary
将数据绑定到可执行文件中:更新2 -获取资源大小:我无法正确读取_binary_foo_bar_size。在运行时,gdb通过
display (unsigned int)&_binary_foo_bar_size
显示文本资源的正确大小。但是将其赋给变量总是会给出错误的值。我可以通过以下方法解决这个问题:这是一个变通办法,但它工作得很好,也不是太难看。
4jb9z9bj2#
除了前面提到的建议,在linux下,您可以使用十六进制转储工具xxd,它有一个生成C头文件的特性:
wooyq4lh3#
.incbin
GAS directive可以用来完成这个任务。下面是一个完全免费的许可库:https://github.com/graphitemaster/incbin
incbin方法是这样的:你有一个thing.s汇编文件,用gcc -c thing.s编译
在您的c或cpp代码中,您可以使用以下语句引用它:
然后你将得到的.o与其余的编译单元链接起来。感谢@John Ripley,他的答案如下:C/C++ with GCC: Statically add resource files to executable/library
但是上面的方法并没有incbin给予的那么方便。要用incbin完成上面的操作,你不需要编写任何汇编程序。下面的代码就可以了:
holgip5t4#
对于C23,现在有预处理器指令
#embed
,它不需要使用外部工具就能达到你想要的效果。参见6.10.3.1的C23标准(这里有一个最新working draft的链接)。这里是good blog post关于#embed
的历史,是这个新特性背后的一个委员会成员写的。以下是标准草案的一个片段,演示了它的用途:
目前不存在C++的等效指令。
mxg2im7a5#
如果我想把静态数据嵌入到一个可执行文件中,我会把它打包成一个.lib/.a文件或者一个头文件,作为一个无符号字符数组。如果你正在寻找一种可移植的方法,我已经创建了一个命令行工具,它实际上可以同时执行here。你所要做的就是列出文件,并选择选项-l 64以输出64位库文件沿着包含指向每个数据的所有指针的头。
您还可以浏览更多选项。例如,此选项:
会将image.png的数据以十六进制格式输出到头文件中,并根据-j选项对齐各行。
e7arh2l66#
您可以在头文件中执行此操作:
把它也包括进去。
另一种方法是读取着色器文件。