2011-05-08 82 views
2

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

error while loading shared libraries: libSDL-1.2.so.0: cannot open shared object file: No such file or directory

即使我捆绑.so文件,系统似乎并不使用它。

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

+0

你在哪里放置'.so'文件?系统只会在搜索路径中找到它们。 – 2011-05-08 21:01:54

+0

与可执行文件位于同一目录中。我不想将任何东西安装到系统路径中,因为我不想要求root访问权限。 – John 2011-05-08 21:02:48

回答

6

默认情况下,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

1

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

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

+0

这实际上是非常明智的答案。虽然我不想承担任何特定的发行版,但不仅仅是压缩二进制文件,还有.deb软件包对Ubuntu/Debian用户非常有用 - 我认为这些发行版是最流行的版本之一。 – John 2011-05-14 13:53:10

+1

@John:我建议查看关于如何做到这一点的Ubuntu资源:[link](https://wiki.ubuntu.com/PackagingGuide)。这是相当读的,但它的一些部分可以被简化(例如使用CDBS来设置规则)。一些使CMake或[qmake](https://wiki.ubuntu.com/PackagingGuide/QtApplication)等系统具有其他工具,可以使此过程更轻松。使用pbuilder创建.deb包也是一个好主意。通过这种方式,您可以确保该软件包可以在另一个系统上工作(所有依赖关系都在.deb中正确定义) – Orka 2011-05-14 15:07:38