Re[5]: Экспорт p-impl из dll
От: kov_serg Россия  
Дата: 24.07.23 17:51
Оценка:
Здравствуйте, Chorkov, Вы писали:

_>>Делайте классическим способом:

C>В конце прошлого века я сам такое всем советовал.
Так в C++ добавили дофига всякого не нужного хлама, а вот для работы с динамическими библиотеками руки пачкать не хотят.

C>Различие в менеджерах памяти неважно, если право владения указателями (в т.ч. в составе объектов, таких как std::vector) не будет предаваться за пределы dll.

Самый оптимальный вариант с интерфейсами.

C>У меня не передается, поскольку конструкторы/деструкторы/оператор= — экспортируются, а доступа к приватным членам нет, в том числе со стороны членов класса, генерируемых компилятором (потому что их нет).

В интерфейсах вообще ни слова о приватных полях, только публичные методы.

C>Из опасностей остается:

C>1) различие в выравнивании (если в классе несколько членов),
C>2) различение в реализации передаваемых объектов (std::vector может хранить два указателя, а может указатель и длину, или длина будет храниться в блоке под указателем,... )
C>3) Передаваемые объекты не должны содержать inline (или генерируемых компилятором) членов, которые вызывали бы функции C-runtime или C++-runtime, который действительно может измениться. Это было бы нарушением ODR.
Всё это хорошо скрывается интерфейсами. В том числе и выравнивание, и исключения ныкаются через HRESULT.

C>Собственно п.(2) и (3) не позволяют передавать объекты стандартной библиотеки под windows. (Под linux проблемы нет, но мне нужны обе платформы.)

Вы можете и из под виндовс иметь общий runtime если будете стандартную билиотеку динамически линковать. Но это будет квази динамическая библиотека, она будет прибита к версии рунтайма гвоздями. Т.е. если это плагин то он должен собираться строго с той же версией стандартных dll иначе не загружаться или же просто рассыпаться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.