在编译的二进制文件

时间:2017-10-13 19:54:51

标签: c embedded-resource

我们说我正在创建一个使用链接到程序中的字体库的应用程序,它具有API函数,例如:

void load_font(char* path); 

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

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

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

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

3 个答案:

答案 0 :(得分:1)

当然。 Qt和其他框架一样。{{3}}。一个图像或任何文件毕竟只是一些二进制数据的核心。您可以将文件读取为二进制流,将其存储(通常作为字节数组)然后只要您还存储它的文件签名(文件的一部分实际上告诉您该文件应该表示什么),您就可以将其转换回来)。所有这些都与语言无关,因此无论是C,C ++,Python等都无关紧要。

但要注意的是 - 在二进制文件中嵌入这些资源会导致二进制文件的大小增加,但更重要的是资源会停留在那里,所以如果你想改变一个资源,你就必须重新编译整个文件。

答案 1 :(得分:1)

我不知道这是多么可移植,但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上工作,这可能更合适。

答案 2 :(得分:1)

将字体保留为外部资源要好得多(最好还是通过像fontconfig这样的通用框架来定位它们)。

所有字体都有编码限制,许多字体都有错误,除非你有绝对的控制权并预知你的应用程序要显示的文本,嵌入字体文件就是在角落里画画。

每当需要处理新的unicode代码点而不是更改整个二进制代码时,所有参与者都可以更简单地替换外部字体(或者,更好地配置另一种字体集),并且可能使以前的QA无效。想想新的货币符号,时尚的表情符号,在新的地理区域中使用,遵守客户图形章程,特殊的辅助功能字体,以后总是需要更改字体文件。

最后,字体受法律保护并具有特定许可(甚至是免费字体)。如果您将这些内容嵌入您的软件中,您需要向律师咨询法律方面的问题。嵌入是一种极端情况,您收到字体文件的许可证可能无法覆盖它。