gpt4 book ai didi

c - 在编译的二进制文件中包含一个非文本文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:38 25 4
gpt4 key购买 nike

假设我正在创建一个应用程序,它使用一些链接到程序中的字体库,并且它有一个 API 函数,例如:

void load_font(char* path); 

其中路径是字体文件(*.ttf 或 *.otf)的相对路径。

但是,我想在安装过程中包含一些字体(作为二进制文件的一部分)。有没有办法将这些文件的内容包含在二进制文件中,然后将指向这些文件位置的某种指针传递给库函数?我是否必须修改库以更改它读取字体文件的位置?

我正在考虑的另一种方法是将这些文件与安装捆绑在一起,并检测二进制文件本身内的位置,这也可行,但后来我遇到了一些问题,无法找到二进制文件的正确位置(例如,可以从另一个目录运行,或从其他地方链接)。

对于这样的事情,最好的方法是什么(如果有的话)?

最佳答案

我不知道它的可移植性如何,但是 gcc 提供了一种机制来在目标文件中存储任意二进制 blob,并引用它们。

假设我有一个数据文件“test.txt”。将它嵌入到这样的目标文件中:

ld -r -b binary -o test.o test.txt 

这将创建符号 _binary_test_txt_start_binary_test_txt_end,它们可以像这样在 C 模块中使用:

extern char _binary_test_txt_start[];                                                                                          
extern char _binary_test_txt_end[];
int main (int argc, char **argv)
{
int i, size = _binary_test_txt_end - _binary_test_txt_start;
for (i = 0; i < size; i++)
putc (_binary_test_txt_start[i], stdout);
putc ('\n', stdout);
...
}

我只将它用于文本,但我想其他数据也可以。我承认我不知道可以包含的数据量是否有限制——至少几十 kB 似乎没问题。我在 Linux 和 Linux 的 Windows 子系统上使用过这种机制。 gcc 版本之间关于二进制符号的命名方式似乎存在一些差异,但我尝试过的版本产生了

_binary_[filename]_[extension]_start

在 Windows 上有一个资源 API,用于将对象文件中的字体、图像等加载到 Win32 API 对象中,如果您在 Windows 上工作,这可能更合适。

关于c - 在编译的二进制文件中包含一个非文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46737151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com