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

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

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

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

У меня был проект 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2021, 19:27
Ответы с готовыми решениями:

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

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

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

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

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

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

Не по теме:

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

0
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
31.01.2021, 23:20  [ТС]
Тут я с вами согласен, но иногда хороший совет можно получить быстрее. Так же разборка от простого к сложному, может занять неоправданно много времени.
Мне просто не понятно что значит сначала линковал? Как я могу влиять на порядок линковки?
Так же может быть такое что lib файл был собран для линковки dll версии и при этом это могло работать когда все зависимости были в одной dll, до рефакторинга? Или это не возможно?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.02.2021, 00:32
BaredJJ, lib-файл может обозначать как статическую библиотеку, так и библиотеку импорта DLL.
1
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,524
01.02.2021, 13:31
Цитата Сообщение от 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
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:19  [ТС]
Хмм, это дей1ствительно интересно, так как до этого все работало. Lib файл был скомпилирован для dll и в исходниках был assimp.dll. А я могу как то сделать так, чтобы использовании моей GraphicCore.dll, включающей ObjectLoader.lib, включающей assimp.lib - assimp.dll была встроена внутрь или знала где можно искать эту dll, а то сейчас получается мне приходиться копировать assimp.dll в output directory?
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,524
01.02.2021, 14:29
Цитата Сообщение от BaredJJ Посмотреть сообщение
assimp.dll была встроена внутрь
а у вас есть её статическая версия (этой либы)?.. так и собирайте вашу главную dll со всеми статическими внутри... не знаю, как там у вас в VS это делается... но на крайний случай можете использовать универсальный вариант- пропишите всё в Makefile - все подробности вашей сборки вашей dll... и собирайте make'ом
0
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:30  [ТС]
Понял. Попробую пересобрать под статическую либу.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,524
01.02.2021, 14:48
можно же даже поэтапно в 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
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 14:59  [ТС]
Нет вы не правильно поняли. Изначально была dll которая использовала assimp.lib и часть иходников assimp. Эту dll использовал C# код.
Я вырезал код использующий assimp из dll и поместил его в static lib. Так же в новую библиотеку добавил зависимости assimp.lib и часть исходников assimp.
Вот после этого все перестало работать.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,441
01.02.2021, 15:04
Цитата Сообщение от JeyCi Посмотреть сообщение
можно же даже поэтапно в Makefile сделать- скомпилировать отдельно и потом слинковать всё в dll - нужную
а случаем, не подскажете, как, образно говоря, из Makefile в винде проект сделать. Ну то есть, есть у меня файл Makefile - в нём вроде как прописаны все зависимости, а что с ним дальше делать? через какую прогу запускать чтоб проект получить?

Добавлено через 4 минуты
Цитата Сообщение от BaredJJ Посмотреть сообщение
Изначально была dll которая использовала assimp.lib и часть иходников assimp. Эту dll использовал C# код
Может не все зависимости были помещены в static lib? Откуда уверенность, что dll которая использовала assimp.lib, не использует ещё что-нибудь. В C# же изначально подключается куча Dll - хотя тут я возможно и не прав, так как не специалист по шарпу - есть только небольшой опыт.
0
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2021, 15:07  [ТС]
Я как то один раз собирал либы через CMake (cmake-gui)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2021, 15:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru