c++ - 如何让一个程序在其他电脑上运行?

标签 c++ export libraries allegro

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

最佳答案

我刚才不得不弄清楚这个问题,下面是一个基于对我有用的步骤的指南。很可能有一种“更好”的方式来静态链接到 allegro。

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

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

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

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

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

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

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

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。

关于c++ - 如何让一个程序在其他电脑上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291062/

相关文章:

C++ 私有(private)函数 : Whether to pass class member variable by function parameter, 或不

c++ - 如何在 Visual Studio Code 中构建和运行作为发布版的 C++ 应用程序

c# - 如何使用 VB.Net/C# 将图像从 SQL 数据库导出到特定文件夹?

java - 将 Coinbase Exchange API 库添加到 Eclipse 项目时出现问题

c++ - LNK2019:OpenCV 中未解析的外部符号

mysql - 在Delphi中找不到libmysql.dll和其他从ZeosLib连接到MYSQL的文件

c++ - 当一个对象被传递给它时,成员函数的行为会改变吗?

c++ - 什么是 OpenCV stereo_calib 的好结果?

android - 如何为发布方式导出准备好 APK 文件?以及要设置的参数是什么?

mysql - 如何导出大型 MySQL 表