我可以提供我的程序的linux二进制文件与我的系统的共享库吗?
Could I supply linux binaries of my program with shared libraries of my system?
因为我还没有找到一种合适的方法来静态地链接程序(用c++编写),如果我要在其中使用插件(链接器警告dlopen在运行时需要glibc共享库)。此外,目前我不能为大多数linux发行版构建动态链接的二进制文件,所以我可以只分发源代码或尝试分发二进制文件以及ldd
在我的系统中发现的共享库,例如:
libc.so.6
libdl.so.2
libgcc_s.so.1
libm.so.6
libstdc++.so.6
因为我认为用户更容易被要求添加到.bash_profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<path to program directory>
而不是从头开始编译程序和插件。
那么,首先,我是否可以自由地重新发布这些库,因为它们是根据GNU LGPL许可的?
这样做有意义吗?这个程序能在大多数linux发行版和它的版本中正确运行吗?
分发二进制文件的最佳方式是以自由许可证(如GPL)的源代码形式发布程序;然后发布者(和贡献者)最终会为他们的发布打包你的程序(你不必为此烦恼)。
否则,你可以为一些主要的Linux发行版分发二进制包(例如.deb
用于Debian或Ubuntu, .rpm
用于Redhat或Centos或Mandriva)。
一些非自由软件(如用于驱动ATI显卡的AMD/ATI Catalyst fglrx)以生成适当二进制包的形式分发(在最终用户机器上)。
您提到的所有库都可以在每个标准(不太旧的Linux发行版)中使用。你不需要分发它们,只需要提到你需要它们(并给出它们的精确列表,以及它们的版本号)。
我真的会避免[重新-]分发系统库像libc.so.6
或libstdc++.so.6
;避免分发它们的主要原因是您的用户(在他的系统上安装您的副本)很可能会在他自己的系统上造成很大的混乱(这可能会破坏其他现有的程序,这将使您的用户生气)。当然,如果你选择(在我看来是错误的)分发它们,你必须遵守它们的许可证。但是你的用户已经有了它们,通过重新分配它们,你增加了出现大混乱的可能性。因此,只需提供您的程序的二进制可执行文件(适当打包),而不需要它所需的系统库。
所有的包管理器(和包格式)都处理依赖关系(在其他包上),所以在极少数情况下,当用户的系统还没有libstdc++.so.6
时,会安装它。
您不应该重新分发这5个库,因为大多数现代Linux系统已经提供了它们。如果你决定不顾一切地重新发布它们,你还需要提供它们的源代码;详细信息请阅读LGPL(或摘要)。
- 为什么我的共享库中存在展开符号
- 链接二进制库或共享库时,为什么必须传入我依赖的共享库?
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 为什么我的程序寻找共享资源.dll而不是Commons.lib
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- CUDA我的共享内存代码不起作用,我缺少什么
- 如何与他人共享我的 SFML 游戏而不会出错?
- 我的共享内存对象保存在哪里
- 使用我的共享指针获取内存泄漏
- 如何共享我的 C/C++ 项目并隐藏一些源代码
- 为什么我的按钮类项目共享相同的lambda功能
- lua加载我的c++共享库,但不加载它的依赖共享库
- 我的交叉编译器找不到共享库
- 我可以在libleveldb.a中找到符号,但是当我创建共享库时,找不到相同的符号。
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- CUDA,可以使用共享内存可以提高我的性能
- CMake没有创建可以访问我的共享库的可执行文件
- 即使我修改了LD_LIBRARY_PATH,也找不到我的共享库
- Linux:为什么加载程序找到我的共享库
- sprof如何定位我的共享库