部署Linux游戏、共享库/依赖项

部署Linux游戏、共享库/依赖项,linux,sdl,Linux,Sdl,我有一个跨平台的应用程序(游戏)。它使用SDL库。由于LGPL许可,我无法静态链接它。在Windows I bundle DLL文件上,在Mac OSX I bundle Frameworks目录下。但是如何在GNU/Linux上解决这个问题呢?如果用户的系统上未安装SDL库,则会出现错误: 加载共享库时出错:libSDL-1.2.so.0:无法打开共享对象文件:没有此类文件或目录 即使我捆绑了.so文件,系统似乎也不会使用它 另一个问题是我不想强制覆盖用户库。SDL不是问题,但例如OpenAL

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

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

即使我捆绑了.so文件,系统似乎也不会使用它


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

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

$> LD_PRELOAD=/path/to/your.so programName
正确的方法是设置
LD\u LIBRARY\u PATH
环境变量,它是一个以冒号分隔的搜索路径列表。将库的路径添加到此列表中

$> export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/your/libs"
$> programName
如果您真的想获得创造性,如果您正确配置二进制文件,它实际上可以包含自己的搜索路径:


还有。

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


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

您将
文件放在哪里?只有在搜索路径中,系统才会找到它们。在与可执行文件相同的目录中。我不想在系统路径中安装任何东西,因为我不想要求根访问权限。这实际上是非常明智的答案。虽然我不想假设有任何特定的发行版,但拥有压缩二进制文件和.deb包对Ubuntu/Debian用户非常有帮助——我认为这些发行版是最受欢迎的发行版之一。@John:我建议查看Ubuntu资源,了解如何做到这一点:。这是一个相当复杂的过程,但其中的一些部分可以简化(例如使用CDB设置规则)。有些系统,如CMake,或有其他工具,使这一过程更容易。使用pbuilder创建.deb包也是一个好主意。通过这种方式,您可以确保包在另一个系统上工作(所有依赖项都在.deb中正确定义)