我有一个跨平台的应用程序(游戏)。它使用SDL库。由于LGPL许可,我无法静态链接它。在Windows上我捆绑了DLL文件,在Mac OSX上捆绑了Frameworks目录。但是如何在GNU / Linux上解决它呢?如果用户的系统上没有安装SDL库,则会出现错误:
加载共享库时出现错误:libSDL-1.2.so.0:无法打开共享对象文件:没有这样的文件或目录
即使我捆绑.so文件,系统似乎也没有使用它。
另一个问题是我不想强行覆盖用户库。 SDL不是问题,但是例如OpenAL库差异很大,用户可以使用OpenAL库,而我的机器可能会崩溃。
答案 0 :(得分:6)
默认情况下,Linux不搜索当前目录,也不搜索运行二进制文件的目录。如果您想要简单的方法,请执行以下操作:
$> LD_PRELOAD=/path/to/your.so programName
正确的方法是设置LD_LIBRARY_PATH
环境变量,这是一个以冒号分隔的搜索路径列表。将库的路径添加到此列表中。
$> export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/your/libs"
$> programName
如果您真的想要发挥创意,如果您正确配置它,您的二进制文件实际上可以包含自己的搜索路径:
答案 1 :(得分:1)
还有$ORIGIN。
答案 2 :(得分:1)
此解决方案完全依赖于您正在使用的Linux发行版(更具体地说是包管理器),但我认为它是解决您问题的“最干净”的解决方案:
创建一个包含您的应用程序的包(在Ubuntu或Debian上,这将是一个与apt一起使用的.deb包)。这样,您可以设置对共享库的依赖性。您不必自己部署SDL / OpenAL,如果这些软件包是在较新版本中发布的,则您不必更新自己的软件包。这样,您的应用程序将更小,更容易分发,如果目标系统上没有SDL / OpenAL,它们将被安装。缺点是您的应用程序不是自包含的。