我想知道是否有一种方法可以通过包含文件或头文件或类似文件来加载外部二进制文件作为 C 中的变量。
例如,在我目前正在进行的一个项目中,我正在使用一个具有图形显示器的嵌入式系统,该系统将使用 ASCII 数据和命令来显示文本和次要图形(框、线等)。但是,它也会显示单色位图。因此,我有一系列用于用户界面的静态显示,以及一些用于启动屏幕的位图。
现在我提到它是一个嵌入式系统的原因是没有文件系统可以加载数据,只有RAM和程序存储器,因此我希望使用的任何“预制”数据或表都必须在编译时加载通过源文件或使用链接器通过目标文件。不幸的是,IDE 不提供任何方法来将任何形式的二进制文件加载到程序内存中,以任何易于识别的方式用作数据缓存。
我已经必须解决这个问题了,(使用十六进制编辑器将二进制文件读取为 ASCII 编码的十六进制,并将原始数据作为变量复制并粘贴到头文件中),有没有一种方法可以“链接” ”到一个文件或“包含”一个可以在编译时作为 const 变量加载的文件?
我使用的系统是 Microchip 系列处理器的 MPLAB X,编译器是 GNC。在我尝试通过特定的编译器/链接器软件专门寻找方法之前,我主要想知道是否有办法通过某些 C 命令或函数来做到这一点。
不,你不能直接这样做。一种方法是将二进制文件转换为 C 源代码并将这些片段包含到您的项目中。转换可以通过 you 编写的简单程序或某些第三方程序来完成。
例如:
Binaray1.c(自动生成)
unsigned char binaray_file1[] =
{
1,2,3,10,20,
....
} ;
Binaray2.c(自动生成)
unsigned char binaray_file2[] =
{
0,0,10,20,45,32,212,
....
} ;
SomeSourceFile.c
extern unsigned char binary_file1[] ;
extern unsigned char binary_file2[] ;
// use binary_file1 and binary_file2 here.
在类 Unix 系统上执行此操作的常用方法是使用
ld -r binary
。这是 Linux 的教程:
http://www.burtonini.com/blog/computers/ld-blobs-2007-07-13-15-50
总而言之,命令:
ld -r -b binary -o foo.o foo.txt
将生成一个目标文件 foo.o,其中包含符号
_binary_foo_txt_start
、_binary_foo_txt_size
和 _binary_foo_txt_end
,其用法如下:
extern char _binary_foo_txt_start[];
还有一个针对 Mac OS X 的,稍微复杂一点: 编译用于链接 OSX 的二进制文件
这个想法是让链接器创建一个具有已知符号名称的目标文件,这些符号名称指向二进制 blob 的开头和结尾,并将其复制到生成的目标文件中。然后,您将该对象文件链接到您的应用程序中,并通过
extern char*
指针等引用该 blob。
我想你知道如何链接系统上的对象,所以剩下的问题是你的链接器是否支持类似
-r binary
的东西。
当然,您可以发明自己的格式,但在此之前:先了解一下 XPM 位图格式,它正是用于此目的:将像素图集成到 C 源代码中。