如何使程序在其他计算机上运行?

How to make a program run on other computers?

本文关键字:运行 计算机 其他 何使 程序      更新时间:2023-10-16

我用 c++ 和 Allegro 5 做了一个游戏,它在我装有 Linux 的电脑上运行良好。我想知道如何创建一个可以导出到另一台 Linux 计算机的软件包,并在不安装 Allegro 的情况下使其运行。谢谢

我刚才必须弄清楚这一点,以下是基于对我有用的步骤的指南。很可能有一种"更好"的方式来静态链接到 allegro。

首先,您需要 allegro 的静态库。如果您的发行版 不打包这些,你必须自己构建它们:

  1. 克隆源代码(假设您将其克隆到名为allegro的目录中)。
  2. 创建构建目录:cd allegro && mkdir build && cd build
  3. cmake .. -DSHARED=off.这指定了我们想要静态(非共享)库
  4. make
  5. 现在,您应该在构建目录中的lib下看到以.a扩展名结尾的库。

现在你可以像这样链接到静态库:

gcc main.c -o main -Lpath/to/allegro/build/lib -lallegro-static

除非您在标准库路径中安装静态库(例如/usr/lib) 您需要-L参数为链接器提供指向 刚刚构建的静态库。

如果您只是尝试上述操作,您会注意到许多链接器错误到其他 图书馆。静态链接时,需要手动指定链接器 标志到 Allegro 的依赖项。老实说,我不记得这是为什么,但是 我只知道我必须这样做。

若要确定这些依赖项,请尝试使用共享的 图书馆:

gcc main.c -o main -lallegro

然后在生成的二进制文件上运行ldd(main)。您应该看到类似以下内容:

linux-vdso.so.1 (0x00007fff1dbfd000)
liballegro.so.5.2 => /usr/lib/liballegro.so.5.2 (0x00007f8b802ea000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8b7ff4c000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f8b7fc48000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8b7fa2b000)
...
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f8b7c551000)

将其中每个都转换为链接器标志,最终命令将如下所示:

gcc main.c -o main -lallegro -lm -lpthread -lX11 ...

你会注意到你不必链接到ldd输出中的所有内容,你 可以使用它来查找所需的最小链接器标志集。您将需要 如果要链接到其他模块,则使用更多链接器标志。例如,链接lallegro_audio-static将需要像-lpng这样的标志才能链接到PNG 图书馆。

最终,你会发现一组标志,让你静态链接到 快板。若要检查结果,请在静态链接的二进制文件上运行ldd;你 应该注意到allegro不再包含在输出中,因为用户会 不再需要动态链接到 Allegro。

Allegro 的答案对于任何库都是相同的。它没有任何特别之处。上一张海报的答案涉及实现细节,所以我将从 10,000 英尺的角度来介绍它:

对于任何库,您有三个选项。

  • 静态编译库。

  • "动态"编译库,并将 Allegro 库文件随程序一起提供。(*.DLL 对于 Windows,*。SO "共享对象"文件适用于 Linux。这些文件与您正在执行的二进制文件位于同一目录中。

  • "动态"编译库,与以前相同,但依赖于已在系统上的系统目录中安装的库。(例如,Windows\System32)

在第一种情况下,库代码以物理方式添加到程序中。

第二种情况和第三种情况是相同的,只是您用它打包了什么。您的程序已编译(但不包含 Allegro 库代码),并被告知它将在运行库后"找到"该库。启动时,运行时链接器(Linux 中的 LD,有关更多信息的运行man ld)获取代码的所需符号(外部函数和全局变量)列表,检查起始目录中是否有合适的匹配库,如果没有,则检查其他系统目录。

第二种情况将所需的文件与程序放在一起。

第三种情况依赖于已经安装的所需文件,或者附带外部"运行时分发"安装程序,Microsoft经常这样做。(DirectX 运行时、Visual C++ 运行时等)

因此,由于您的目标是Linux,因此可以使用第一种或第二种情况。将特定版本的 Allegro 编译到代码中,或者随代码一起提供所需的版本。第二种情况的优点是,您可以在以后更改 DLL/SO 文件,而无需编译(对于补丁/错误修复),如果您有多个可执行文件,则只需要一组库代码。

应该注意的是,并非所有库都允许您(因为它们的许可证)将二进制文件包含在程序中。这就是为什么您经常会看到"Microsoft可再发行组件"。但是,Allegro 的许可证并不在乎。