mmr*_*mmr 20 linux deployment shared-libraries
我有一个依赖于Qt,GDCM和VTK的应用程序,主构建环境是Qt.所有这些库都是跨平台的,可在Windows,Mac和Linux上进行编译.我需要在Windows上部署后将应用程序部署到Linux.我正在使用的vtk和gdcm的版本是git的主干版本(大约一个月前),比我在Ubuntu 11.04上获得的更新,这是我当前(也是唯一的)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?我应该包含我想要的库的特定版本,然后弄清楚如何使可执行文件在本地目录中查找这些库并忽略它在库路径中找到的库?
Nem*_*emo 27
我见过的每一个"严肃"的商业应用都使用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 "$@"
Run Code Online (Sandbox Code Playgroud)
他们将此脚本命名为,.wrapper并创建一个如下所示的目录树:
.wrapper
lib/ (directory full of .so files)
app1 -> .wrapper (symlink)
app1.bin (executable)
app2 -> .wrapper (symlink)
app2.bin (executable)
Run Code Online (Sandbox Code Playgroud)
现在你可以将整个树复制到你想要的任何地方,你可以运行"/ path/to/tree/app1"或"/ path/to/tree/app2 --with --some --arguments",它会工作.所以将/ path/to/tree放在PATH中.
顺便说一句,这也是Firefox和Chrome或多或少的做法.
LD_LIBRARY_PATH恕我生命告诉你不要使用它的人充满了它.
您要放入哪些系统库lib取决于您希望正式支持的Linux版本.
甚至不要考虑静态链接.glibc开发人员不喜欢它,他们不关心支持它,并且他们以某种方式设法在每次发布时更加努力地打破它.
祝好运.
一般来说,你最好取决于你正在定位的任何发行版的库的"正常"版本(并且说你不支持不支持最近版本的lib的dists),但如果你真的需要依赖某些共享库的最新版本,您可以链接您的应用程序,-Wl,-rpath,'$ORIGIN'然后在可执行文件所在的目录中安装所需的确切版本的副本.
请注意,如果使用make,则需要$$在makefile中获取单个$实际发送到链接器的参数.需要单个qutoes所以shell不会让事情变得很糟糕......
| 归档时间: |
|
| 查看次数: |
5209 次 |
| 最近记录: |