С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
1

Использование dll с зависимостями

31.01.2021, 19:27. Показов 1723. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

У меня был проект dll для работы с графикой на C++ и проект на C# WPF использующий это dll. Эта связка работала нормально. Я решил выделить из dll загрузку объектов в отдельную библиотеку и сделав рефакторинг, переместил часть кода в static library. Настроил все. Теперь схема проекта такая:
1. Satic library
2. Dll использует static library
3. C# импортирует dll.

Проблема заключается в том, что я получаю System.DllNotFoundException при попытке обратиться к dll в шарповом коде, хотя dll находиться в одном каталоге с exe файлом. Интересней то, что все работает корректно, если я убираю обращение к методам в static library. Я полагаю что я скорее всего как то не до конца сконфигурировал dll. Статическая библиотека и динамическая собираются без ошибок. Использую Visual Studio 2019. Есть какие ни будь мысли?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2021, 19:27
Ответы с готовыми решениями:

Использование функций DLL из другой DLL
Ребята подскажите имеется hscli.DLL hscli.LIB и hscli.H , собираю свою DLL-ку , которая...

Использование String Tables в .dll(.dll.mui) (Для VB .NET)
Здравствуйте. Нужно извлечь(а потом запоковать) таблицу строк(string tables ). Допустим есть...

Использование String Tables в .dll(.dll.mui) (Для C#)
Здравствуйте. Нужно извлечь(а потом запоковать) таблицу строк(string tables ). Допустим...

Использование Dll
Извините за нубский вопрос. Мне чтобы определиться, распланировать дальнейшие действия нужно знать,...

26
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
31.01.2021, 19:43 2
Цитата Сообщение от BaredJJ Посмотреть сообщение
Статическая библиотека и динамическая собираются без ошибок. Использую Visual Studio 2019. Есть какие ни будь мысли?
Сделай консольное приложение и подключи к нему свою dll. При запуске тебе покажет, чего именно не хватает.
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 19:45  [ТС] 3
Консольное на плюсах или на шарпах?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
31.01.2021, 19:47 4
Либо открой свою dll при помощи depends.exe, посмотри от каких dll она зависит и проверь что все они есть

Добавлено через 23 секунды
Цитата Сообщение от BaredJJ Посмотреть сообщение
Консольное на плюсах или на шарпах?
На плюсах
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 19:59  [ТС] 5
Интересно. У меня статическая библиотека это обертка над assimp, который содержит исходники и lib файл. А сейчас при запуске dll у меня сообщение о том, что невозможно найти dll этой зависимости. Имя этой dll должно полностью совпадать с lib файлом assimp. Это вообще законно, я же не могу пересобрать проект под dll?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
31.01.2021, 20:00 6
Цитата Сообщение от BaredJJ Посмотреть сообщение
Интересно. У меня статическая библиотека это обертка над assimp, который содержит исходники и lib файл. А сейчас при запуске dll у меня сообщение о том, что невозможно найти dll этой зависимости. Имя этой dll должно полностью совпадать с lib файлом assimp. Это вообще законно, я же не могу пересобрать проект под dll?
Скорее всего, assimp.dll и не может найти.
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 20:06  [ТС] 7
Да это теперь понятно. Но как такое происходит? assimp.dll у меня вообще не было. Был один проект dll который включал исходники assimp и assimp.lib - все работало. Я вынес код обертки в статическую библиотеку, перенес исходники assimp и assimp.lib в новый проект. Подключил к старому проекту dll, а теперь нужна assimp.dll. Это как так получилось?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
31.01.2021, 20:09 8
Цитата Сообщение от BaredJJ Посмотреть сообщение
Да это теперь понятно. Но как такое происходит? assimp.dll у меня вообще не было. Был один проект dll который включал исходники assimp и assimp.lib - все работало. Я вынес код обертки в статическую библиотеку, перенес исходники assimp и assimp.lib в новый проект. Подключил к старому проекту dll, а теперь нужна assimp.dll. Это как так получилось?
Скорее всего, сначала ты линковал статическую библиотеку assimp, а потом прилинковал динамическую
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 20:10  [ТС] 9
У меня скоро мозг взорвется

Можете немного по подробней, как я могу это в принципе сделать.
0
DrOffset
31.01.2021, 22:41
  #10

Не по теме:

BaredJJ, в таких случаях всегда надо остановиться, и разобраться во всем с самого начала на новом примере. Затем вернуться к старому, с уже уложившимися знаниями, и сделать все правильно.

0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 23:20  [ТС] 11
Тут я с вами согласен, но иногда хороший совет можно получить быстрее. Так же разборка от простого к сложному, может занять неоправданно много времени.
Мне просто не понятно что значит сначала линковал? Как я могу влиять на порядок линковки?
Так же может быть такое что lib файл был собран для линковки dll версии и при этом это могло работать когда все зависимости были в одной dll, до рефакторинга? Или это не возможно?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
01.02.2021, 00:32 12
BaredJJ, lib-файл может обозначать как статическую библиотеку, так и библиотеку импорта DLL.
1
329 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,429
01.02.2021, 13:31 13
Цитата Сообщение от BaredJJ Посмотреть сообщение
Но как такое происходит? assimp.dll у меня вообще не было. Был один проект dll который включал исходники assimp и assimp.lib - все работало. Я вынес код обертки в статическую библиотеку, перенес исходники assimp и assimp.lib в новый проект. Подключил к старому проекту dll, а теперь нужна assimp.dll.
DLL не думает о своих зависимостях в compile-time'e, т.к. она и к ней может быть подключена к чему угодно и что угодно в run-time'e... в статической библиотеке зависимости важны и их надо описать или слинковать -static уже в compile-time'e (=compiler+linker в данном случае) , т.к. потом уже ничего к ним не подключить в run-time'e...

Добавлено через 4 минуты
(и если зависит от dll и если не собрали с флагом -static, то потом эту dll и затребует)
в смысле- сама ваша dll может затребовать свою зависимость в run-time'e ... раз она dll... что и делает
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:19  [ТС] 14
Хмм, это дей1ствительно интересно, так как до этого все работало. Lib файл был скомпилирован для dll и в исходниках был assimp.dll. А я могу как то сделать так, чтобы использовании моей GraphicCore.dll, включающей ObjectLoader.lib, включающей assimp.lib - assimp.dll была встроена внутрь или знала где можно искать эту dll, а то сейчас получается мне приходиться копировать assimp.dll в output directory?
0
329 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,429
01.02.2021, 14:29 15
Цитата Сообщение от BaredJJ Посмотреть сообщение
assimp.dll была встроена внутрь
а у вас есть её статическая версия (этой либы)?.. так и собирайте вашу главную dll со всеми статическими внутри... не знаю, как там у вас в VS это делается... но на крайний случай можете использовать универсальный вариант- пропишите всё в Makefile - все подробности вашей сборки вашей dll... и собирайте make'ом
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:30  [ТС] 16
Понял. Попробую пересобрать под статическую либу.
0
329 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,429
01.02.2021, 14:48 17
можно же даже поэтапно в Makefile сделать- скомпилировать отдельно и потом слинковать всё в dll - нужную

Добавлено через 17 минут
p.s.
Цитата Сообщение от BaredJJ Посмотреть сообщение
до этого все работало. Lib файл был скомпилирован для dll и в исходниках был assimp.dll.
вот об этом я и говорила:
ваша lib была слинкована с вашим assimp, и при этом жёстко связана с нужной dll, которую вы пихаете в C#, насколько поняла... теперь же вы пытаетесь, насколько поняла, эту lib переделать в dll => зависимости, если и смогут установиться какие-либо, то только в run-time, а в сборке ничего ни от чего не зависит...
а с вашим C# я вообще не знаю, чего вы ждёте от JIT-компилятора в run-time'e -- он не будет за MSVC выполнять его недоделанную работу (т.е. в данном случае не доработали вы, а не MSVC. - разорвав связи между 2мя dll'ями)... эти связи, мне так очень сильно кажется, в принципе можно и на уровне кода C++ оформить, не обязательно надеяться на линкер, а прямо в коде правильно LoadLibrary задействовать и правильно указатель на экспортируемые/импортируемые функции dll'и оформить ... и в любом случае не отдавать всё это (установку правильных связей/зависимостей) на откуп JIT-компилятору, который тут вообще ни при чём... имхо
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:59  [ТС] 18
Нет вы не правильно поняли. Изначально была dll которая использовала assimp.lib и часть иходников assimp. Эту dll использовал C# код.
Я вырезал код использующий assimp из dll и поместил его в static lib. Так же в новую библиотеку добавил зависимости assimp.lib и часть исходников assimp.
Вот после этого все перестало работать.
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,337
01.02.2021, 15:04 19
Цитата Сообщение от JeyCi Посмотреть сообщение
можно же даже поэтапно в Makefile сделать- скомпилировать отдельно и потом слинковать всё в dll - нужную
а случаем, не подскажете, как, образно говоря, из Makefile в винде проект сделать. Ну то есть, есть у меня файл Makefile - в нём вроде как прописаны все зависимости, а что с ним дальше делать? через какую прогу запускать чтоб проект получить?

Добавлено через 4 минуты
Цитата Сообщение от BaredJJ Посмотреть сообщение
Изначально была dll которая использовала assimp.lib и часть иходников assimp. Эту dll использовал C# код
Может не все зависимости были помещены в static lib? Откуда уверенность, что dll которая использовала assimp.lib, не использует ещё что-нибудь. В C# же изначально подключается куча Dll - хотя тут я возможно и не прав, так как не специалист по шарпу - есть только небольшой опыт.
0
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 15:07  [ТС] 20
Я как то один раз собирал либы через CMake (cmake-gui)
0
01.02.2021, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2021, 15:07
Помогаю со студенческими работами здесь

Использование DLL
Недавно увидел, как сделать dll библиотеку. Ну вот я ее сделал и она нормально скомпилировалась,...

Использование DLL
Доброго времени суток! Относительно недавно мне сказали (не знаю правда или нет) про то что можно...

Использование DLL
Доброго времени суток. Есть DLL (создана на C#). Как использовать ее в проекте? HMODULE hDLL =...

Использование .dll
Приветствую, Господа! Получил .dll файлик. Regsvr32 file.dll загружает удачно, но библиотека...

Использование DLL C++ в C#
Здравствуйте! Написал одну простенькую dll'ку на С++ и гружу ее в прогу на C#. Проблема такова, у...

Использование .DLL
Как использовать подпрограммы из библиотеки <.DLL> в программах на Visual C++, (статически) если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru