|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||||||||||||
Предупреждение при создании динамической библиотеки11.01.2021, 19:19. Показов 9196. Ответов 56
Добрый вечер,
У меня мало опыта создания динамических библиотек. Я пытаюсь написать динамическую библиотеку, в качестве системы сборки использую используя CMake. Моя динамическая библиотека задействует Eigen библиотеку и HighFive. Это хэдэр онли библиотеки (но вторая задействует HDF5 библиотеку, которая компилируется отдельно).
warning: C4251: 'MyClass::devCurveGroup': class 'HighFive::Group' needs to have dll-interface Я погуглил и насколько я понял, суть заключается в следующем: внутри класса MyClass я использую шаблонные классы стандартной библиотеки (вероятно внутри HighFive::Group и HighFive: ataSet), которые я пытаюсь экспортировать (так как экспортирую весь класс MyClass ). Шаблонные классы (и функции) в неявном виде (без явной инициализации класса/функции) нельзя экспортировать, отсюда и предупреждение насколько я понимаю. И в результате, если я скомпилирую свой класс MyClass в библиотеку с этим предупреждением, то эту скомпилированную динамическую библиотеку можно использовать только приложениями, собранными моим же компилятором (у меня MSVC 2019 x64) и нельзя путать Release/Debug версии библиотеки.Верно ли это высказывание? Вообще я думал что ни статические, ни динамические библиотеки, собранные компилятором А, не получается использовать с компилятором Б, и нельзя смешивать релиз/дебаг версии библиотек, иначе получаешь ошибки на этапе линковки. class_export.h генерируется с помощью CMake функции:
0
|
||||||||||||||||
| 11.01.2021, 19:19 | |
|
Ответы с готовыми решениями:
56
Вызов функции одной динамической библиотеки из другой динамической библиотеки Ошибка при подключении динамической библиотеки
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 16.01.2021, 17:55 | ||
|
Добавлено через 6 минут Kerim_Geophysic, В этом случае вам нужно будет: 1) сделать хороший, непротиворечивый интерфейс к библиотеке; 2) сторонние библиотеки лучше из интерфейса убрать. В С++ есть несколько подходов как это обеспечить (например PIMPL); 3) классы можно оставить, но тщательно изучить особенности экспорта классов в каждом из поддерживаемых вами компиляторов; 4) Если вы собрались передавать сложные объекты, использующие динамическую память, через границу DLL, то продумать варианты использования библиотеки времени исполнения С++ в вашей DLL. Написать библиотеку, которой смогут без проблем пользоваться другие люди, непростая задача, поэтому советую вам тщательно разобраться во всех аспектах, прежде чем что-то выкладывать в общий доступ. Добавлено через 4 минуты Kerim_Geophysic, вариант, когда одна DLL подходит всюду, конечно, самый лучший. Но его не всегда "бесплатно" можно получить. Т.е. нужно смотреть по ситуации, чем мы платим и что получаем взамен. Может так получиться, что цена в виде понижения выразительности, ограничения возможностей или в слишком большом количестве второстепенной работы может перекрыть пользу от универсальности библиотеки. Советую тщательно изучить уже существующие решения, на github есть множество примеров разных подходов. Уделите день-два на анализ.
2
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||
| 20.01.2021, 19:10 | ||
|
0
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||
| 03.02.2021, 16:53 | ||||||
|
Использование интерфейсов при работе с DLL - кратко, локанично и по утверждению автора
======== ... совсем забыла... мы же результат из dll возвращаем в тот же указатель, с которым пришли в эту dll от клиента... значит, ваш ответ по dynamic_cast становится очень даже понятным... ![]() но мне всё равно кажется, что если мы в абстрактном классе сделаем виртуальные методы с разными названиями для разных наследников - то хоть таким способом сможем реализовать полиморфизм в dll (ТС вроде писал, что хочет в dll'е обрабатывать разные файлы)... если кастить от родителя к потомкам не придётся - то и нормально... имхо?.. а от потомков к предкам и так кастится без лишних классов... касательно компиляторов - всё упирается в name-mangling, и чтобы этого избежать оборачивается в extern "c"... но можно писать dll и на чисто С (поняла, почему, например, sqlite3 весь на С в source_code)... тогда, конечно, перегрузкой, как вариантом реализации полиморфизма, не воспользоваться - но на C, наверно, есть др. рабочие ходы или просто немного др. архитектуру сделать для этих целей?.. имхо... в любом случае, для ТСа вариант перегрузки в классе, может ли подойти?.. чтобы без этих его optional... или std::variant ?.. - хотя тут (в любом C++), видимо всё опять упрётся в разность компиляторов, если таковая будет иметься для dll и для клиента... и в name-mangling... ! в связи с этим мне показалось, что dll'и на С++ вообще НЕ очень хорошая идея с учётом этого name-mangling от разных компиляторов и даже версий одного компилятора... на С надёжнее писать dll'и... имхо?.. (ну нет полиморфизма на С - и не надо, - загрузиться в нужную функцию dll'и ещё на стороне клиента [в смысле создать указатель на нужную функцию] и то нормально)... действительно, её удобство появится лишь если она сможет быть подключена к клиенту с любого компилятора... иначе смысла нет так заворачивать отдельный модуль в подарочную упаковку, чтобы подарить клиенту в run'time'e... всё равно придётся постоянно перезаворачивать... ну или оборачивать dll в COM, как уже звучало
1
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.02.2021, 17:12 | ||
|
Т.е. можно не заморачиваться, static_cast нормально будет отрабатывать.
1
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||
| 03.02.2021, 19:16 | ||||
|
Добавлено через 27 минут p.s. для инфо - Основы COM-pdf (хотя в Borand казалось, что это проще - Borland C++ Builder 6. Холингворт) Добавлено через 34 минуты p.p.s. Добавлено через 5 минут p.p.p.s. и regsvr32 для com сделать как-то проще, чем везде с собой носить эту dll (или разве что запихнуть её в Windows S*S)...- по линку отсюда... имхо
0
|
||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|||||||||||||||||||||
| 04.08.2021, 03:21 [ТС] | |||||||||||||||||||||
|
oleg-m1973, доброго времени,
Я написал свою библиотеку в виде интерфейсов с полиморфизмом. Руководствовался советами, полученными в этой теме, в частности этим постом В упрощенном виде есть у меня такой интерфейс h5base.h (на самом деле это базовый интерфейс и далее от него наследуются интерфейсы, но всю цепочку сложно приводить):
Я заметил, что если я пытаюсь удалить сырой указатель то он удаляется нормально:
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body. Интуиция подсказывает, что в данном случае так и должно быть, но я не понимаю что не так. Если возможно, прокомментируйте пожалуйста происходящее
0
|
|||||||||||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 04.08.2021, 07:50 | |
|
Kerim_Geophysic, просто не надо руками вызывать Delete.
Добавлено через 2 минуты Если нужно удалить объект до окончания времени жизни умного указателя, используйте base.reset()
1
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
| 05.08.2021, 00:39 | ||||||
|
Kerim_Geophysic, сделай вот так
И - виртуальный деструктор для H5Base и виртуальное наследование для H5BaseImpl не нужны
1
|
||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 05.08.2021, 01:35 [ТС] | |
|
oleg-m1973, спасибо за совет
Завтра попробую, потестирую П.С. вообще виртуальное наследования я делал для решения задач множественного наследования. Сейчас точно не помню как там множественное наследование работает, но в реальности у меня структура примерно такая как показана на картинке в приложении (так как я ранее пытался упростить схему и изменял названия, и если у вас вдруг возникнут вопросы которые взрывают мозг то на всякий случай вот ссылка на мою библиотеку )
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 05.08.2021, 12:40 | |||||||
Сообщение было отмечено Kerim_Geophysic как решение
Решение
1
|
|||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||||
| 05.08.2021, 15:03 [ТС] | ||||||||
|
oleg-m1973,
Например в деструктор класса H5SurfImpl я добавил:
Оказалось, что при разрушении объекта типа H5Surf_ptr как и положено появляется надпись SURF_DESTR. Просто не очень хочу делать ObjectDeleter шаблоном, так как немного больше кода придется писать конвертируя этот шаблон в питон с помощью pybind11 (но если это необходимо, то в принципе проблем возникнуть не должно с пибайдом). Классы H5Base и H5BaseImpl родоначальники иерархии и H5Base ни от кого не наследуются, а H5BaseImpl наследуется только от абстрактного (или интерфейса, не знаю как правильно назвать) класса H5Base. Абстрактный H5BaseObject наследуется от абстрактного H5Base, но его реализация H5BaseObjectImpl включает также в себя реализацию H5BaseImpl и естественно добавляет новые методы, задекларированные в H5BaseObject. Ну и так далее с другими классами. Мне кажется тут множественное наследование у меня имеет место быть (до этого я никогда множественное наследование не использовал, это первый опыт)
0
|
||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||
| 05.08.2021, 17:25 | ||||
|
Добавлено через 3 минуты
0
|
||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||
| 06.08.2021, 20:52 [ТС] | ||
|
oleg-m1973,
Мне интересно это вы на опыте такое решение с шаблонами предложили, или сходу сообразили? На данный момент у моя библиотека разделена на файлы заголовки (.h) и реализации (.cxx). Если я заменю множественное наследование шаблонами то придется пару часов на это потратить. Вот я думаю, в чем будет заключаться разница (не плане красоты кода, или внешнего оформления, а в плане работы с классами) между шаблонным подходом и нынешним с множественным наследованием? Например будет ли разница в применении dynamic_cast<>() для кастинга наследников в родителей и наоборот?
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 06.08.2021, 20:57 | |||
|
1
|
|||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||||||||||||||||||
| 02.01.2022, 19:38 [ТС] | ||||||||||||||||||||||
|
oleg-m1973, добрый вечер, с Новым Годом!
H5Base* clone() для H5Map (ну и других наследников H5BaseObject)? То есть понятно что я могу написать override внутри каждого класса ...Impl (например H5MapImpl), но хотелось бы видеть решение задачи в следующем виде:
error: allocating an object of abstract class type 'H5BaseObjectImpl<H5Map>' Суть ошибки понятна, но реализация для H5BaseObject работает нормально:
0
|
||||||||||||||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.01.2022, 20:35 | ||
Сообщение было отмечено Kerim_Geophysic как решение
РешениеНо он, вроде простой, в чём проблема? Иначе придётся сильно усложнять код, на мой взгляд, оно того не стоит.
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 03.01.2022, 21:07 [ТС] | |
|
oleg-m1973, понял, буду знать, спасибо
0
|
|
| 03.01.2022, 21:07 | |
|
Любимый Visual Studio не хочет поспособствовать мне в создании библиотеки(статической и динамической)
Зачем при создании библиотеки создавать два файла (.h и.cpp) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|