我见过一些没有功能的代码。它们只有数据,文件应该转换为数据文件,而不是可执行文件。
例如,它类似于
config.c
const unsigned char configData[] = \
"Cnf"
"\0x01\0x01\0x00\0x00\0x00\0x00\0x00\0x00"
"LOCAL/ITEM.MSG\0x00"
"\x7E\xD1\xF5\x3A\0x00\0x00\0x00";该文件应该以二进制形式转换为config.dat,从Cnf\0x01\0x01...开始,以没有页眉或页脚的\xF5\x3A\0x00\0x00\0x00结尾。
这种行动的名称是什么?我有谷歌关键词的问题。
而且,如何使用gcc编译器完成这样的操作?
更新:我不是在使用fwrite或库。我不想在上面的代码中添加任何内容,也不想从代码中删除任何行。让我们保持这个文件原封不动。我的问题不是创建二进制文件。我的问题主要是理解编译器是如何处理这些特定文件的。我在嵌入式系统行业中见过这样的文件。但还没有发现它们是如何工作的。
发布于 2022-05-19 01:26:03
解释为:“如何在构建时将二进制文件嵌入到我的C程序中?”
我就是这样做的。我使用自定义构建步骤将二进制文件转换为.c文件。
在Makefile:
program: main.c configData.c resource.h # and more
$(CC) -o program main.c configData.c # and more
configData.c: configData.dat bin2c
./bin2c configData.dat configData.c
bin2c: bin2c.c
$(HOSTCC) -o bin2c bin2c.c 在资源方面:
extern char configData[];
extern size_t configDataLen;在bin2c.c中:
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc < 3) {
fprintf(stderr, "Usage: bin2c binary.dat binary.c symbol\n");
return 1;
}
FILE *in = fopen(argv[1], "rb");
if (!in) { perror(argv[1]); return 1; }
FILE *out = fopen(argv[2], "w");
if (!out) { perror(argv[2]); return 1; }
int c;
long len = 0;
fprintf(out, "#include <stddef.h>\n");
fprintf(out, "char %s[] = {"
while ((c = getc(in)) > EOF) {
if (len > 0) puts(',', out);
fprintf("%d", c);
++len;
if (ferror(out)) { perror(argv[2]); return 1; }
}
fprintf(out, "};\n");
fprintf(out, "size_t %sLen = %ld;", len);
if (ferror(out)) { perror(argv[2]); return 1; }
if (fclose(out)) { perror(argv[2]); return 1; } /* Yup check fclose for errors */
if (ferror(in)) { perror(argv[1]); return 1; }
return 0;
}在.gitignore中:
bin2c
configData.c人们做得比这更好。我见过一些花哨的链接器脚本,这些脚本使链接器能够获取dat文件。我的方法具有易于理解和便携的优点。
https://stackoverflow.com/questions/72297444
复制相似问题