当前位置: 首页 > 面试题库 >

部署依赖共享库的linux应用程序的公认方法是什么?

姜杜吟
2023-03-14
问题内容

我有一个依赖Qt,GDCM和VTK的应用程序,主要构建环境是Qt。所有这些库都是跨平台的,可以在Windows,Mac和Linux上编译。在Windows上部署后,我需要将应用程序部署到Linux。我正在使用的vtk和gdcm的版本是git的主干版本(大约一个月大),比我在Ubuntu
11.04上获得apt-get的版本要新,这是我当前(也是唯一的)Linux部署目标。

部署依赖于这些库的应用程序的公认方法是什么?

我应该在这里静态链接以避免LD_LIBRARY_PATH吗?我在LD_LIBRARY_PATH上看到有冲突的报告;像教程这一个建议是“正确的方式”来修改库路径通过系统重新启动,以使用共享库。
其他人
建议我永远不要设置LD_LIBRARY_PATH。在默认版本的GDCM中,安装已将库放入/usr/local/lib目录中,因此在运行时可以看到这些库ldd <my program>。另一方面,VTK将其库放入/usr/local/lib/vtk-5.9,这不是大多数用户计算机上LD_LIBRARY_PATH的一部分,因此只有在对系统进行一些更改后才能找到。将VTK文件复制到’/
usr / local / lib’不允许’ldd’查看文件。

那么,如何使我的应用程序看到VTK来使用这些库?

在Windows上,部署dll非常简单,因为我只能将它们包含在安装程序中,而应用程序会找到它们,因为它们位于本地目录中。这种方法在Linux中不起作用,因此我将让用户从任何适当的来源安装Qt,GDCM和VTK并使用默认位置,然后将应用程序指向这些默认位置。但是,由于VTK将事物放置在非标准位置,因此我还应该期望用户修改LD_LIBRARY_PATH吗?我是否应该包括所需的特定版本的库,然后弄清楚如何使可执行文件在这些库的本地目录中显示,而忽略在库路径中找到的可执行文件?


问题答案:

我见过的每一个“严肃的”商业应用都在使用LD_LIBRARY_PATH。它们总是包含如下所示的shell脚本:

#!/bin/sh

here="${0%/*}"  # or you can use `dirname "$0"`

LD_LIBRARY_PATH="$here"/lib:"$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
exec "$0".bin "$@"

他们将脚本命名为类似的名称,.wrapper并创建如下所示的目录树:

.wrapper
lib/  (directory full of .so files)
app1 -> .wrapper (symlink)
app1.bin (executable)
app2 -> .wrapper (symlink)
app2.bin (executable)

现在,您可以将整棵树复制到所需的任何位置,并且可以运行“ / path / to / tree / app1”或“ / path / to / tree /
app2 –with –some –arguments”,它将起作用。因此将/ path / to / tree放入PATH中。

顺便说一句,这也是Firefox和Chrome或多或少地做到这一点的方式。

LD_LIBRARY_PATH恕我直言,告诉你不要使用的人都充满了。

您要放入哪些系统库lib取决于您要正式支持的Linux版本。

甚至不要考虑静态链接。glibc开发人员不喜欢它,他们不关心是否支持它,并且他们设法在每个发行版中都将其破解得更加困难。

祝好运。



 类似资料:
  • 我有两个网络应用程序,它们部署在同一个野蝇中。这两个webapp都应该共享某些库,这些库不属于野蝇模块的一部分。 为了使部署不依赖于特定的wildfly,我不希望通过wildfly模块系统提供共享库(我知道,用户可以定义模块)。 我的方法是简单地将库和两个webapp放在部署目录中,并在各自的jboss部署结构中引用它们。然而,这失败了。 我试图将该库嵌入到战争中,并通过 由于找不到模块,因此它将

  • 在生产环境中在Ubuntu12.04上部署Node.js的推荐方法是什么? 我看到了这个ppa,但我不知道是否是很好的维护,或如果它将,如果是一个女巫的来源,一个可以信任。 我知道手动安装Node.js很容易,但在我看来,使用Ubuntu packages manager安装Node.js会让我有一些安全的管理时间,并且与当前管理底层服务器的方式更加集成。那么,你有什么建议呢?先谢谢你。

  • 问题内容: 我有一个依赖于希望在目录结构中找到共享库的程序。我想将共享库移到一个更好的位置。在OS X上,可以使用install_name_tool来完成。我找不到Linux的等效版本。 作为参考,吐出以下解释的输出: (根据要求,:) 我想将“ this / is / terrible / library.so”更改为“ shared / library.so”。请注意,如果程序留在其“构建”位

  • 我刚刚遇到了一个奇怪的问题,这是我第一次在服务器上部署spring boot应用程序 像往常一样,我使用java命令java-jar myApp运行应用程序。罐子 过了一会儿,我看到应用程序停止了,没有留下任何错误消息。 所以我不知道问题出在哪里, 可能的原因是java内存不够,所以我将其增加到7GB,因为它有套接字 但问题依然存在 请注意,我没有docker,服务器是Amazon light s

  • 在将一个导出的Java项目从开发机器转移到生产机器之后,我遇到了麻烦。 java项目(一个Eclipse插件)有一个我写的JNI库,它依赖于一个开源库,而开源库又依赖于Boost。我在我的SLES11机器上编译了所有东西,包括Boost,这个程序就可以工作了。 当我把程序移到另一台机器上时,我得到了一个错误: 我在同一个目录中复制了所需的库<代码>ldd libMyJNI。因此列出了20个依赖项,

  • 问题内容: 通过不将数十个JAR依赖项包装到lib目录中,OSGi似乎具有一个小的可部署工件的巨大好处。但是,我找不到任何能告诉我一种简单,可靠的方式来将依赖项部署到容器的方法。例如,我有一个使用CXF和几个Spring子项目的应用程序。如果需要将此应用程序部署到新的Glassfish服务器上,那么最好的方法是确保安装所有依赖项? 我正在使用Maven, 似乎 可以使用某种方法来查看META-IN