我想用c ++创建一个跨平台的安装程序。它可以是任何压缩类型,例如zip或gzip,嵌入程序本身,就像普通安装程序一样。我不想在不同的平台,linux和windows上创建许多更改。如何将文件嵌入和提取到跨平台的c ++程序?
答案 0 :(得分:2)
对于跨平台安装程序来说,C ++是一个糟糕的选择,因为没有跨平台的机器代码。
C ++代码可以非常轻松,但需要为每个平台编译,然后为每个平台获得不同的输出可执行文件。
如果要从单个源文件为许多平台构建安装程序,可以使用C ++。但是,如果要构建可在许多平台上运行的ONE安装程序,则需要使用解释或JIT编译的语言,并在所有目标上提供运行时支持。其中,唯一可能已安装在每个平台的大多数计算机上的是Java。
好的,假设您从机器代码构建了许多单平台安装程序,这就是所需要的:
您需要将压缩代码放入程序中。您希望以不会严重影响加载时间的方式执行此操作,也不会导致编译需要几个月的时间。所以使用初始化的全局数组是一个坏主意。
一种方法是将您的数据作为附加部分进行链接。有一些工具可以帮助解决这个问题,例如Binary to COFF converter,我也见过ELF版本,也许是this。但是这可能仍然导致运行时库在执行开始之前尝试将整个文件引导到内存中。
另一种方法是使用特定于平台的资源API。这是有效的,但特定于平台。
最直接的解决方案是简单地将压缩存档附加到可执行文件,然后在压缩存档开始的位置附加8个字节。解压缩就像在只读模式下打开可执行文件fseek(-8, SEEK_END)
一样简单,读取正确的偏移量,然后寻找压缩数据的开头并将该流传递给解压缩器。
当然,现在我找到a website listing pretty much the same methods。
和here's a program which implements the last option,还可以存储多个文件。我不建议这样做,让压缩库负责存储文件元数据。
答案 1 :(得分:0)
我知道的唯一方法是可移植地嵌入数据(字符串或原始,二进制 数据)在C ++程序中将其转换为数据表,然后进行编译 那。对于原始数据,这看起来像:
unsigned char data[] =
{
// raw data here.
};
编写一个读取你的小程序应该是相当简单的 二进制数据,并将其写为C ++表,如上所述。编 它,并将它链接到你的程序,你就是。
答案 2 :(得分:0)
使用zlib。
让您的包装程序在程序中生成一个exe列表。 I,E
unsigned char x86_windows_version[] = { 0xff,...,0xff};
unsigned char arm_linux_version[] = { 0xff,...,0xff};
unsigned char* binary_files[MAX_BINARIES] = {x86_windows_version,arm_linux_version};
在你兴奋的某个地方:
enflate(x86_windows_version);
就是这样。查看zlib docs以获取enflate()和deflate()的参数,以及它的相关信息。
这是一种在嵌入式平台(不是linux)上使用的模式,主要用于字符串_tables和其他图像二进制文件。它应该适合您的需求。