我开始构建一个使用开源库的商业应用程序。我一直在研究各种文件和帖子,但我仍然遇到麻烦。据我所知,我需要“隔离”开源部分。一种方法是提供一个通过“vanilla”链接与开源通信的类。
建议的解决方案是修改开源(命令行实用程序)以为其提供某种API。然后开发一个使用API与开源程序通信的包装器或代理程序。将修改后的源和包装器作为开源发布,但保持源的其余部分关闭。请注意,开源片段将随代码一起提供,并作为静态或动态链接库执行。
这是否适用于GPL?
答案 0 :(得分:5)
不,如果它是GPL并且您链接它,您的代码也会变成GPL。如果它是LGPL,情况会有所不同(您可以构建与LGPL许可库链接的商业应用程序),但这似乎并非如此。
答案 1 :(得分:2)
如果你没有链接它,你是明确的。因此,不要为这个开源命令行工具开发API,只需编写一个直接在命令行上与程序交互的小包装器。
由于您没有链接,现在只是执行二进制文件,您的代码不必在GPL下发布。
您可以使用fork,pipe,exec和friends来执行此操作!这是一个简单的解决方案,根据应用程序在命令行上的预期输入,它可以很好地工作(基于curses的东西更难......需要某种类型的终端)
编辑:
从评论中听起来甚至这是无效的,并且仍然可能导致问题。我建议联系律师以确保您是明确的,他将能够解释GPL并告诉您GPL代码可能与您有什么关系。
我认为只是执行GPL程序然后将数据(a.l.a。管道数据发送到其中)不应该导致您的程序也是GPL。
GPL过于复杂,如果我使用命令行工具执行它并将数据传输给它,我的程序仍然可以成为GPL。这很奇怪。在任何时候给我BSD,或麻省理工学院,简单易懂。
答案 2 :(得分:1)
不要相信谈论远程过程调用(COM)或标准IO的人。如果有什么东西可以使用,那么标准的IO产品就来自传统的情况,比如将输出管道输出到grep并将其输入到其他应用程序中。
相反,请考虑这种方式:您的应用程序是否来自GPL组件的衍生作品?您能否向合理聪明的外行人解释为什么您的应用程序不是开放式的衍生产品源库。你可以解释stdio包装和COM接口,直到你脸红,但你的律师,法官,顾客,或谁不会买它。相反,您必须证明删除该GPL库不会显着修改您的应用程序的操作。如果你不能那样做,那么,对不起,但你是在冰上。
答案 3 :(得分:0)
在开始之前,我应该说我不是律师,这不应被视为法律建议。如果您需要法律建议,您应聘请律师。
只要您将程序链接到GPL软件,您的软件就被视为GPL软件的衍生作品。
如果您希望使用GPL软件,则应根据GPL或GPL兼容许可证发布软件。否则,您应该找到另一种能够满足您需求的软件,或者自己编写。 GPL的要点是许可的价格是您还根据自由软件许可证发布了衍生作品的源代码。如果您在未支付相应许可费的情况下不考虑使用专有软件,则不应使用GPL
你可以隔离它的唯一方法是通过一个完全独立的可执行文件,通过通用接口(套接字,管道或其他东西)进行通信,这样你的软件或GPL软件就可以了很容易取代。它通信的接口需要非常通用;它不能依赖于GPL软件的实现细节,例如内部数据布局或任何类型。基本上,如果它通过可用作通用标准的协议进行通信,那么您的软件可以与GPL软件进行通信而不被视为衍生作品。
无论如何,虽然可以使用专有软件与GPL软件进行通信,但您不应该这样做。你将违反GPL的精神,并且必须非常小心地使界面具有足够的通用性,以免被视为侵权。相反,您应该找到一个具有不同许可证的软件,该许可证可以满足您的需求,自行编写,或者在兼容GPL的许可证下发布您的软件。
编辑:关于这个话题,Linux Weekly News上发布了interesting article。根据文章中的分析,即使您在命令行中分离出可以与GPL软件通信的接口,您也应该将其作为一个干净的房间实现,其中一个组使用GPL代码,一个实现其他软件的组,所有在它们之间传递的规范都被律师过滤掉了。所以,真的,比它的价值更麻烦。
答案 4 :(得分:0)
使用GPL我认为唯一的出路是将它包装在类似COM对象(也需要是GPL或兼容性)的东西中,并在运行时连接到对象。因为这可以阻止你(静态地)链接到GPL代码,所以你可以摆脱困境。
该技巧适用于GPL v2代码,但可能不适用于GPL v3。
答案 5 :(得分:0)
请注意,对于GPL有不同的解释,就像有人一样。
我不是律师,但我已经和律师谈过这个问题。这不是法律建议。
一些律师认为动态链接GPL是可以的,并不构成衍生作品。其他人,例如RMS和他的律师认为动态链接不合适,确实构成了衍生作品。大多数人认为静态链接是衍生作品。
关于这个问题存在很多争论,并且没有明确的判例法来定义在这方面什么是衍生作品而不是衍生作品。
例如,请参阅This Article