2011-11-22 55 views
2

我有使用gtkmm,gtkglextmm和exiv2的程序。Linux上的.dll类似于 - 如何获取它们?

我想包含这些库与可执行文件,因为如果用户没有在他/她的系统上有应用程序将不会工作。在Windows上,.dll文件解决了这个问题(我把它们放在与输出文件相同的目录中)。

如何在Linux上附加类似的库?有什么工具可以帮助吗?我无法强制用户安装依赖关系。

+2

在Linux上,相当于.dll的是“动态共享对象”,或者.so。您可以静态链接您的可执行文件中所需的库,但这实际上不是最佳实践。见David Heffernan的回答。您不需要强制用户安装依赖关系;你只需告诉用户这是他们的选择,并且他们不能在没有这些依赖的情况下运行你的应用程序。 –

+0

如果您的程序是免费软件(例如GPL或LGPL许可),您可能会获得帮助将其打包到主要发行版中(有时甚至是一些好人为您打包)。 –

+0

William我已经阅读过某些地方,你不能用gtk(和gtkmm)进行静态链接。我想知道这是不是真的......另外,正如我在David Heffernan的回答下写的 - 即使用户懒得自己安装依赖关系,我也需要让这个程序工作。 – Marco

回答

4

更好的是,使用您想要定位的分布[s]的包系统,例如.deb上于Debian/Ubuntu /薄荷包装(具有​​或apt-get,本身使用dpkg)上红帽/ Fedora的,荫/ RPM,等等等等

DLL-S在Linux称为shared libraries(名为*.so文件)(以ELF格式,请使用objdump,nm ...探索它们,使用gcc -fPIC -shared来构建它们)。它们可以用编程方式加载dlopen & dlsym。请注意,Windows DLL-s之间存在重要区别Linux * .so(dynamic linking在Windows上的含义与&不一样)

0

你可以写简单的sh脚本来启动程序:

#!/bin/sh 
LD_LIBRARY_PATH=/path/to/intall/directory 
path/to/your/exe 

,并把这样的库/路径/到Linux/intall /目录

+1

这并不能解决依赖性问题(细节因分布而异),我不建议这样做。 –

+0

为什么?像glibc这样的基本事物的ABI很少改变,就像X11协议一样。因此,如果您的应用程序中有其他“如此”的库,则可以毫无问题地运行它。现在想象一下情况,当你使用类似qt 4.6的东西时,你需要展示你的应用程序如何看起来像用户。但用户只有古老的debian机器。你做什么,更新所有的系统来运行你的应用程序一次? – fghj

+0

是的,因为Qt有这么多的依赖关系,所以不值得手动解决它们。如果需要的话,在chroot-ed环境中运行一个“新”系统 - 但即使这样也不能用于古代内核和最近的libc –

10

标准的做法是不是重新分配你的依赖。这样做只会造成大量的重复。您应该在安装包中指定依赖项,并让包管理器解决它们。

+0

嗯,我需要让我的程序在Linux上工作,并且有人懒得安装依赖项。我知道什么是标准练习,但我需要在Windows上使用dll来完成此操作。 – Marco

+4

这不是Windows。使用您的首选软件包管理器安装软件包很简单。这只是做到这一点的方式。不要打平台。 –

相关问题