【问题标题】:Deploying Linux game, shared libraries/dependencies部署 Linux 游戏、共享库/依赖项
【发布时间】:2011-05-08 20:59:19
【问题描述】:

我有一个跨平台的应用程序(游戏)。它使用 SDL 库。由于 LGPL 许可证,我无法静态链接它。在 Windows 上我捆绑 DLL 文件,在 Mac OSX 上我捆绑 Frameworks 目录。但是如何在 GNU/Linux 上解决呢?如果用户的系统上没有安装 SDL 库,则会出现错误:

加载共享库时出错:libSDL-1.2.so.0:无法打开共享对象文件:没有这样的文件或目录

即使我捆绑了 .so 文件,系统似乎也没有使用它。

另一个问题是我不想强行覆盖用户库。 SDL 不是问题,但例如 OpenAL 库差异很大,用户可以使用可用的 OpenAL 库,而我的可能会在他的机器上崩溃。

【问题讨论】:

  • 您将.so 文件放在哪里?只有在搜索路径中,系统才会找到它们。
  • 与可执行文件在同一目录中。我不想在系统路径中安装任何东西,因为我不想要求 root 访问权限。

标签: linux sdl


【解决方案1】:

默认情况下,Linux 不会搜索当前目录,也不会搜索运行二进制文件的目录。如果您想要简单的方法,请执行以下操作:

$> LD_PRELOAD=/path/to/your.so programName

正确的做法是设置LD_LIBRARY_PATH环境变量,这是一个冒号分隔的搜索路径列表。将您的库的路径添加到此列表中。

$> export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/your/libs"
$> programName

如果你真的想发挥创意,如果你配置得当,你的二进制文件实际上可以包含自己的搜索路径:

http://www.eyrie.org/~eagle/notes/rpath.html

【讨论】:

    【解决方案2】:

    还有$ORIGIN

    【讨论】:

      【解决方案3】:

      此解决方案完全取决于您使用的 Linux 发行版(更具体地说是什么包管理器),但我认为这是解决您的问题的“最干净”的解决方案:

      制作一个包含您的应用程序的包(在 Ubuntu 或 Debian 上,这将是一个与 apt 一起使用的 .deb 包)。这样您就可以设置对共享库的依赖关系。您不必自己部署 SDL/OpenAL,如果这些软件包以较新的版本发布,您就不必更新自己的软件包。这样,您的应用程序将变得更小且更易于分发,并且如果目标系统上不存在 SDL/OpenAL,它们将被安装。缺点是您的应用程序不是独立的。

      【讨论】:

      • 这实际上是一个非常明智的答案。虽然我不想假设任何特定的发行版,但拥有压缩二进制文件和 .deb 包对 Ubuntu/Debian 用户非常有帮助——而且我认为这些发行版是最受欢迎的发行版之一。
      • @John:我建议查看有关如何执行此操作的 Ubuntu 资源:link。读起来很不错,但其中的某些部分可以简化(例如使用 CDBS 设置规则)。一些诸如 CMake 或 qmake 之类的系统具有使此过程更容易的附加工具。使用 pbuilder 创建 .deb 包也是一个好主意。这样可以确保包可以在另一个系统上运行(所有依赖项都在 .deb 中正确定义)
      猜你喜欢
      • 2012-04-05
      • 2012-08-11
      • 2011-10-01
      • 1970-01-01
      • 2015-03-05
      • 2016-02-18
      • 2011-10-29
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多