我可以在我的闭源应用程序中dynamic调用LGPL / GPL软件吗?
我想使用GNU宽松通用公共许可证(GNU General Public License, GNU通用公共许可证(GPL)版本2)下的某个工具( ffmpeg )。
为此,我只能在我的软件中这样称呼它:
System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo = new System.Diagnostics.ProcessStartInfo("lgplSoftware.exe", myParams); p.Start();
我不改变它,我只使用Windows的内置版本的软件。
维基百科说:
与GPL相关的一个重要争议是非GPL软件是否可以dynamic链接到GPL库。 GPL明确要求GPL下的所有衍生代码作品必须属于GPL。 虽然据了解,静态链接产生派生作品,但是不清楚dynamic链接到GPL代码的可执行文件是否应该被认为是派生作品(参见Weak Copyleft)。 免费/开源软件社区是分裂在这个问题上。 FSF声称,如果可执行代码和GPL代码“互相调用函数并共享数据结构”,那么这样的可执行文件确实是一个衍生工作,而某些人(例如Jerry Epplin)同意某些(例如Linus Torvalds)同意dynamic链接可以创build派生的作品,但不同意的情况。
所有这些法律事情让我感到困惑。 我也会把我的项目LGPL也发布出来,但是这不是我所能做到的。
所以问题是:我能像现在这样使用它,还是会被一大批律师执行?
链接在计算机编程中具有特定的含义。 你根本没有链接GPL或LGPL的代码,你只是产生一个GPL或LGPL的二进制文件,GPL和LGPL允许。 你的用户可以自由地使用这个二进制文件来达到作者的预期目的,并且可以自由地下载和编译源代码,所以他们的所有自由都被保留下来,而且你没有违反GPL或LGPL。 (这就是GPL常见问题解答所说的“交stream沟通”)。这甚至不违反LGPL和GPL的精神; 他们容忍专有软件的存在,并假设在某些时候专有程序将产生免费程序,反之亦然。 (否则,我们无法在Windows下运行任何GPL软件。)
GPL确实要求专有和GPL的程序“不能以使其成为单一程序的方式组合”。 如果你的程序完全依赖于GPL的可执行文件,那么即使它是一个独立的二进制文件,它也不会被使用,那么这可能会让你更加生气。 (现在是时候咨询你的律师了解确切的了。)
此外,虽然您没有具体询问这一点,但请记住,使用软件分发GPL或LGPL的软件意味着您需要在安装程序中包含许可证副本,并且还要分发源代码码。 例如,如果您在安装程序中打包应用程序,并在安装程序中包含GPL'ed或LGPL'ed可执行文件的副本,则您将分发LGPL'ed或GPL'ed代码,并且必须提供源代码的副本(通过邮件提供,或通过CD,取决于您如何分发您的应用程序)。 包括到上游项目的链接是不够的(至less在GPL的第2版中)。 阅读GPL和LGPL的确切细节。
纠正我,如果我错了,但我相信你描述的情况是这样的:
- 你有一个GPL或LGPL程序,作为一个单独的可执行文件构build,不需要你做任何修改。
- 您正在构build一个需要GPL或LGPL程序function的闭源应用程序。
- 在您的程序中,您使用您的框架或操作系统工具来运行另一个单独的可执行文件。
- 您正在程序中使用该可执行文件的输出。
如果是这样的话,你实际上并没有链接到GPL或LGPL授权的程序。 因此,您不受该程序许可条款的约束。 实际上这是一个相当普遍的方式,即使这种方法可以避免这种可执行文件的授权问题。
但是,这违背了GPL和LGPL的精神 。
一般来说,这是我认为是GPL真正讨厌的几件事情之一。 更糟糕的是它有多传染性。 不过,还有一种方法可以解决这个问题。
首先,定义你自己的接口来发送数据。 这将在您的应用程序和将要创build的单独的库之间使用。 请勿重复使用GPL代码中的任何内容,因为这些代码将属于GPL许可证。 但是,使用类似的结构没有任何问题。 由于这个接口是你自己创build的,所以它会属于你自己的许可证。 你可以随心所欲地使用它。
接下来,围绕GPL代码创build一个包装库,它也将实现您的个人界面。 这个库将归入GPL许可证,因此受到污染。 但是,虽然它会将您的界面暴露给外部世界,但您的界面不会受到污染。 这不是派生的或任何。 这是100%你自己的代码,你可以使用相同的接口连接到不同的库。
这个包装库将作为你自己的合法代码和GPL代码之间的保护缓冲区。 你自己的代码永远不会是GPL,因为它不直接使用任何GPL代码。 该接口也将作为一个解决scheme来改变GPL代码的一个不同的解决scheme。
绕过许可证限制是一个窍门,但是由于界面只是你自己的,你的只能是你的,所以GPL将被阻止。 如果以这种方式使用GPL代码和非GPL代码将是两个不同的程序。
不过,请注意,您可能需要一些法律build议。 SO的律师不多。 但这是一个可以解决这个GPL许可证的技巧。
我不是律师,这不能成为法律意见。 随着我们身后,恕我直言,如果你链接的代码是LGPL,你是清楚的。 如果是技术上的GPL,这是一个问题。
GPL和LGPL之间的区别在于,与LGPL代码链接,不会触发共享的需要。
你可以使用LGPL软件来做到这一点,但是你不能用GPL授权的软件来做到这一点。
LGPL 2.1关于组合作品的第6节说明了如何在闭源程序中使用该库。 你可以像你一样调用LGPL授权程序,甚至可以dynamic链接到它。
GPL没有这样的例外,当你使用GPL程序/库作为你的程序的一部分,以便它被认为是你的程序的一个组成部分,那么你必须根据GPL兼容许可证来授权所有的东西。 请参阅此GPL-FAQ条目 。