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

时间:2016-12-22 20:18:35

标签: c++ export libraries allegro

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

2 个答案:

答案 0 :(得分:1)

我不得不在不久之前解决这个问题,接下来是基于对我有用的步骤的指南。可能会有一个更好的"静态链接到快板的方式。

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

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

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

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

    如果您只是尝试以上操作,您会发现其他链接器错误 库。静态链接时,您需要手动指定链接器 标志着快板的依赖。说实话,我不记得为什么会这样,但是 我只知道我必须这样做。

    要确定这些依赖关系,请尝试使用共享构建程序一次 库:

    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。

答案 1 :(得分:0)

对于任何图书馆来说,Allegro的答案都是一样的。它没有做任何特别的事情。上一张海报的答案涉及实施细节,所以我会从10,000英尺的角度来看它:

任何图书馆都有三个选项。

  • 静态编译库。

  • 动态编译库"并随您的程序发送Allegro库文件。 (* .DLL for Windows,* .SO"共享对象" Linux文件。)文件与您正在执行的二进制文件位于同一目录中。

  • 动态编译库"与以前一样,但依赖系统目录中系统上已安装的库。 (例如,windows \ system32)

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

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

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

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

因此,既然您要针对Linux,那么您可以使用第一种或第二种情况。将您特定版本的Allegro编译到您的代码中,或者使用您的代码发送您想要的版本。第二种情况的优点是,您可以在以后更改DLL / SO文件而无需编译(对于补丁/错误修复),如果您有多个可执行文件,则只需要一个一套图书馆代码。

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

相关问题