将压缩文件嵌入c++;程序 我想在C++中创建跨平台安装程序。它可以是任何压缩类型,例如zip或gzip,就像普通安装程序一样嵌入到程序本身中。我不想在不同的平台(linux和windows)上进行太多更改。如何将文件嵌入和提取到C++程序,跨平台?< /P> < P> C++是跨平台安装程序的一个糟糕选择,因为没有跨平台机器代码。

将压缩文件嵌入c++;程序 我想在C++中创建跨平台安装程序。它可以是任何压缩类型,例如zip或gzip,就像普通安装程序一样嵌入到程序本身中。我不想在不同的平台(linux和windows)上进行太多更改。如何将文件嵌入和提取到C++程序,跨平台?< /P> < P> C++是跨平台安装程序的一个糟糕选择,因为没有跨平台机器代码。,c++,installation,cross-platform,C++,Installation,Cross Platform,C++代码的可移植性非常强,但需要为每个平台编译,然后为每个平台获得不同的输出可执行文件 如果您想从单个源文件构建许多平台的安装程序,可以使用C++。但是,如果您想构建一个可以在多个平台上运行的安装程序,则需要使用一种解释语言或JIT编译语言,并在所有目标上提供运行时支持。其中,可能已经安装在每个平台的大多数计算机上的唯一一个是Java 好的,假设您正在使用机器代码构建许多单平台安装程序,那么需要这样做: 您需要将压缩的代码放入程序中。您希望这样做不会严重影响加载时间,也不会导致编译花费几个月

C++代码的可移植性非常强,但需要为每个平台编译,然后为每个平台获得不同的输出可执行文件

<>如果您想从单个源文件构建许多平台的安装程序,可以使用C++。但是,如果您想构建一个可以在多个平台上运行的安装程序,则需要使用一种解释语言或JIT编译语言,并在所有目标上提供运行时支持。其中,可能已经安装在每个平台的大多数计算机上的唯一一个是Java


好的,假设您正在使用机器代码构建许多单平台安装程序,那么需要这样做:

您需要将压缩的代码放入程序中。您希望这样做不会严重影响加载时间,也不会导致编译花费几个月的时间。因此,使用初始化的全局数组是个坏主意

一种方法是将数据作为附加部分链接到中。有一些工具可以帮助实现这一点,例如,我可能也看到过ELF版本。但这仍可能导致运行库在执行开始之前尝试将整个文件导入内存

另一种方法是使用特定于平台的资源API。这是高效的,但平台特定

最简单的解决方案是简单地将压缩档案附加到可执行文件中,然后在压缩档案开始的位置再附加八个字节的文件偏移量。然后,解包就像以只读模式打开可执行文件一样简单,
fseek(-8,SEEK_END)
,读取正确的偏移量,然后查找压缩数据的开头并将该流传递给解压器


当然,现在我发现了


此外,还具有存储多个文件的附加功能。我不建议这样做,让压缩库负责存储文件元数据。

这是我知道的可移植嵌入数据(字符串或原始、二进制)的唯一方法 数据)在C++程序中是将它转换成数据表,然后编译 那个对于原始数据,这将类似于:

unsigned char data[] =
{
    //  raw data here.
};
编写一个小程序来读取您的 二进制数据,并将其作为C++表写出,与上述类似。编撰 然后将它链接到您的程序中,就可以了。

使用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文档,了解enflate()和deflate()的参数,仅此而已


这是一种在嵌入式平台(不是linux)上经常使用的模式,主要用于字符串表和其他图像二进制文件。它应该能满足您的需要。

好吧,请继续,您不需要我们的许可。或者你想问点什么吗?@Erik,在一个问题结束后,因为人们问了很多“离题”的问题,大约4次。你开始写更大、更不切题的问题。这没有帮助!我很清楚,我必须在每个平台上分别编译它。C++是跨平台的,因为你一次编写,到处编译。@ Wel03UK:现在我明白了,你想从一个共同的代码库中制造出许多平台特定的安装程序。我希望这会更有帮助。谢谢你的回答。我想使用最后一个选项,但是否有任何教程来准确说明步骤。您的编译器在处理几百兆字节数组初始值设定项时使用了多少RAM?您可以使用
#include
使源代码易于管理,但编译时间仍将是可怕的。编译时间并没有那么糟糕——这是一些最简单的编译代码(与模板不同)。但是,如果数据太大,我已经让编译器耗尽了内存。此解决方案可能只适用于非常小的图像。这绝对是无用的。您为哪个目标编译这个多功能安装程序?您必须将它与每个平台的小二进制文件相链接。这些只需构建一次,因为对可交付二进制文件的任何更改都是针对小型二进制文件构建和链接的。所以,一个跨平台构建(在构建树中包括zlib)就是这样。很简单。@PA:但既然安装程序二进制文件只适用于一个平台,为什么不只附加包含该平台程序的存档文件,而不嵌入其他需要另一个安装程序的平台存档文件呢?@ben:是的,没有想到这一点。:)但是,然后将压缩后的数据链接到JAVA中。然后就可以了。(我知道他只想要c++)。用于c/c++安装程序的zlib仍然是一个好主意,因为它可以在任何带有C8+编译器的平台上工作。(为国际化做了类似的事情,它已经在WinXX、MacOS、OS21、Linux上运行,而不需要更改打包机/解包器-
发布版本
生成所有这些)。无/无需维护。