ФлеймФорумОбщее

Почему ООП в С++ конфликтует с лицензией LGPL

#0
10:30, 24 июля 2020

Пару месяцев назад я лениво начал осваивать Qt и столкнулся с явлением о котором ранее не задумывался - о собственно сабже.

Если кто не в курсе быстро поясню в чём косяк:
LGPL если совсем вкратце обязует линковаться к открытой библиотеке динамически чтобы соблюсти принцип "свободное должно оставаться свободным".
Например у пользователя программы должна оставаться возможность заменить открытую библиотеку новой версией и запустить как ни в чём не бывало.

И вот тут у C++ возникает большая проблема - если новая библиотека изменить раскладку в памяти хоть одного объекта, а в ООП программировании мы это делаем постоянно и не напрягаясь дорабатывая и апгрейдя, то ваш несвободный код станет невалиден т.к. без перекомпиляции просто будет лезть не в те места объектов в какие нужно.

В Qt для ликвидации этой проблемы используется прослоечная техника - все объекты "для клиентского кода" на деле являются смарт-пойнтерами в стиле pimpl и никогда не содержат ничего кроме этого указателя и эта конфигурация будучи задана в очередной мажорной версии библиотеки никогда более не меняется. Мы всегда работаем с объектами Qt через такие прослойки.
Тогда действительно поменяв имплементацию надёжно скрытую за pimpl можно еще о чём то говорить. Так и только так.

Так что если вы соберётесь писать ООП-либку на C++ с расчётом выпустить её под лицензией LGPL - одумайтесь, ибо грядёт.

#1
10:36, 24 июля 2020

как-то читал простыню комментов на хабре под Qt статьей, смысл обсуждения и статьи заключались в том, что LGPL это нифига не просто линкуйтесь динамически и используейте pimpl, и как бы велом про использование кода и вообще, мол, покупайте лицензию Qt коммерческую, а то ибо грядет.

#2
10:40, 24 июля 2020

MAMOHT-92
> LGPL это нифига не просто линкуйтесь динамически и используейте pimpl,
Плюс еще большие проблемы с мобильными платформами где закрытые инсталляторы и потому просто заменить dll-ку вообще непросто.
Но это не вина самой LGPL, а этих платформ, но из-за таких проблем действительно проще бывает купить лицуху.

#3
10:43, 24 июля 2020

Человечество вечно создает себе проблем на ровном месте, как тот хохол на велосипеде, сующий ветку себе в колеса.

#4
10:57, 24 июля 2020

Просто интерфейс от имплементации отделять надо. Можно делать сишный интерфейс, как вариант. А что там внутри юзера не должно волновать.

#5
11:07, 24 июля 2020

PANDA
> Можно делать сишный интерфейс, как вариант.
Это самый простой и проверенный временем вариант, но он не ООП.

#6
11:08, 24 июля 2020

=A=L=X=
>но он не ООП.
Я бы поспориль.

#7
11:30, 24 июля 2020

nes
> Я бы поспориль.

Ну речь всё-таки в рамках плюсовского ООП-а.

#8
12:23, 24 июля 2020

=A=L=X=
> Ну речь всё-таки в рамках плюсовского ООП-а.

Ну можно просто делать классы, у которых нет ни одного публичного поля. Тогда будет полностью в рамках плюсовских классов.

#9
12:27, 24 июля 2020

Dmitry_Milk
> Ну можно просто делать классы, у которых нет ни одного публичного поля.
Нельзя. Если сменишь состав полей - data_layout разъездится.

Можно поступать хитрее - сделать конструктор private и заменить его на фабричную функцию, возвращающую unique_ptr. Это будет почти как pimpl - но с явной косвенностью.

#10
12:28, 24 июля 2020

А ещё с таблицой виртуальных функций есть проблемы, чтобы их не было, все виртуальные методы следует сделать protected, чтобы из пользовательского кода напрямую их нельзя было звать.

#11
12:34, 24 июля 2020

Panzerschrek[CN]
> Если сменишь состав полей - data_layout разъездится.

Так тебе, как пользователю библиотеки, какая разница, какой там у ее внутренних объектов layout? Ты же к этим полям никогда сам не будешь обращаться (да, надо еще исключить возможность инлайна).

UPD. А, все, понял, проблемы будут при использовании объектов по месту, а не в куче. Ну тогда да, вариант с закрытием конструктора и реализацией фабрики, возвращающей unique_ptr действительно кажется красивым рещением.

#12
13:33, 24 июля 2020

Надо, имхо, внедрить pimpl в язык, чтобы было не так калечно и с дублированием кода, а по уму.
Объявляешь класс как virtual class и у него сразу первое поле - vtbl, в .h можно только декларации методов предоставить, а вся подкапотня уходит в кишки .cpp и о ней внешнему коду вообще ничего не надо знать включая размер.
Т.е. работать с такими классами можно как раз только через указатели. Что-то среднее между pimpl и COM.

#13
14:01, 24 июля 2020

> Так что если вы соберётесь писать ООП-либку на C++ с расчётом выпустить её под лицензией LGPL
Выпускайте под MPL-2.0 или CDDL

ФлеймФорумОбщее

Тема в архиве.