Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux上的.dll之类的东西-如何获取它们?_C++_Linux_Dll_Compilation_Gtkmm - Fatal编程技术网

C++ Linux上的.dll之类的东西-如何获取它们?

C++ Linux上的.dll之类的东西-如何获取它们?,c++,linux,dll,compilation,gtkmm,C++,Linux,Dll,Compilation,Gtkmm,我有使用gtkmm、gtkglextmm和exiv2的程序 我想在可执行文件中包含这些库,因为如果用户的系统中没有这些库,应用程序将无法工作。在Windows.dll文件上解决了这个问题(我把它们和输出文件放在同一个目录中) 如何在Linux上附加类似的库?有什么工具可以帮你吗?我无法强制用户安装依赖项。您可以编写简单的sh脚本来启动程序: #!/bin/sh LD_LIBRARY_PATH=/path/to/intall/directory path/to/your/exe 将库放到/pat

我有使用gtkmm、gtkglextmm和exiv2的程序

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


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

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

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

将库放到/path/to/intall/directory

Linux上的标准实践是不重新分发依赖项。这样做只会造成大量重复。您应该在安装包中指定依赖项,并让包管理器解决这些依赖项。

更好的是,使用您想要的发行版的包系统,例如,在Debian/Ubuntu/Mint上进行打包(使用
aptitude
apt-get
,本身使用
dpkg
),红帽/软呢帽等上的Yum/Rpm


在Linux上调用DLL-s(文件名为
*.so
)(在格式上,使用
objdump
nm
…来探索它们,使用
gcc-fPIC-shared
来构建它们)。它们可以通过编程方式加载&
dlsym
。请注意,windows DLL-s和Linux*之间有着重要的区别。因此(在windows和Linux上没有相同的含义)

在Linux上,.DLL的等价物是“动态共享对象”或.so。您可以在可执行文件中静态链接所需的库,但这并不是最佳实践。见大卫·赫弗南的答案。您不需要强制用户安装依赖项;您只需告诉用户这是他们的选择,没有这些依赖项,他们无法运行您的应用程序。如果您的程序是自由软件(例如,GPL或LGPL许可),您可能会得到帮助,在主要发行版中打包(有时甚至会有人帮您打包).William我在某个地方读到,你不能用gtk(和gtkmm)进行静态链接。我想知道这是不是真的。。。另外,正如我在David Heffernan的回答下面所写的,即使用户懒得自己安装依赖项,我也需要让这个程序工作。这并不能解决依赖项问题(细节随发行版而异),我不建议这样做。为什么?像glibc这样的基本事物的ABI很少改变,就像X11协议一样。因此,如果你的应用程序中有其他“So”库,你可以毫无问题地运行它。现在想象一下这种情况,当您使用类似Qt4.6的东西时,您需要向用户展示应用程序的外观。但用户只有古老的debian机器。您要做什么,更新所有系统以运行您的应用程序一次?是的,因为Qt有太多依赖项,不值得手动解决它们。如果需要,可以在chroot环境中运行一个“新”的系统——但即使这样也不能与一个古老的内核和一个最近的libcWho命令手动运行它的libcWho一起工作?您可以使用“ldd”任何脚本语言来收集所有依赖项。我不确定它是否比依赖发行版提供的包管理器更简单(在一般情况下)。我需要让我的程序在Linux上运行,有人懒得安装依赖项。我知道什么是标准做法,但我需要像在Windows上使用DLL一样完成这项工作。这不是Windows。使用您首选的软件包管理器安装软件包很简单。这就是解决问题的方法。不要在平台上打架。