【问题标题】:How to make a program run on other computers?如何使程序在其他计算机上运行?
【发布时间】:2016-12-22 20:18:34
【问题描述】:

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

【问题讨论】:

  • 查看 allegro 文档,也许他们说如何将库与应用程序一起打包。
  • 将代码编译成一个对象 (.o) 文件并将其与 allegro 的文件静态链接,同时可能会去除未使用的符号。不过,这可能不合法,您应该考虑阅读 allegro 的许可证以了解有关其与您的程序一起分发的信息。

标签: c++ export libraries allegro


【解决方案1】:

前段时间我不得不弄清楚这一点,以下是基于对我有用的步骤的指南。很可能有一种“更好”的方式来静态链接到 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

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

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。

【讨论】:

    【解决方案2】:

    Allegro 的答案对于任何库都是一样的。它没有做任何特别的事情。之前发帖人的回答进入了实现细节,所以我从一万英尺的角度来看:

    任何库都有三个选项。

    • 静态编译库。

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

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

    在第一种情况下,库代码被物理添加到您的程序中。

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

    第二种情况是把需要的文件放在你的程序中。

    第三种情况依赖于已安装的所需文件,或者随 Microsoft 经常使用的外部“运行时分发”安装程序一起提供。 (DirectX 运行时、Visual C++ 运行时等)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多