Як я можу позбутися від "відсутніх проблем з DLL"?


15

Я робив кілька ігор з Visual C ++ 2015 та OpenGL. Коли я запускав її на своїй машині, проблем не було, але коли я запускав її на інших машинах, це показує, що деякі DLL-файли відсутні. Я хочу знати, як переконатися, що цього не станеться наступного разу, і що я повинен врахувати, щоб уникнути відсутності проблем у файлі?


8
Спочатку переконайтеся, що ви створюєте версію випуску.
користувач253751

3
Якщо ви хочете бути абсолютно впевненими, що від самого VS немає залежностей - але це має свій власний недолік - у налаштуваннях генерації коду ви можете перейти з Multi Threaded / Multi Threaded Debug (для налагодження налагодження) замість MT DLL / MT налагодження DLL . Це збільшує розмір вашого виконуваного файлу, і ваш бінарний файл, складений таким чином, не отримає користі від оновлень часу виконання файлів. Але це залежить від вас. Плюс у тому, що ваш виконуваний файл не матиме "зовнішніх" залежностей. Я не публікую це як відповідь, оскільки це не є вирішенням вашої проблеми, а лише вирішення проблеми.
Gizmo

@Gizmo вирішення все ще є відповіддю, а коментарі є тимчасовими і використовуються для уточнення публікацій, під якими вони знаходяться, і можуть бути видалені. Тож якщо це корисно, слід опублікувати це як відповідь.
user1306322

Хм гаразд. Тоді я опублікую це як відповідь.
Gizmo

Відповіді:


22

Потрібно встановити перерозподілювані версії Visual Studio, яку ви використовували на будь-якій машині, яка хоче запустити виконувані файли, наприклад https://www.microsoft.com/en-us/download/details.aspx?id=48145 для VS2015 . Вам також можуть знадобитися переліки для DirectX або інших компонентів.

Інсталятори програм, як правило, встановлюють усі перерозподільні файли для будь-якої їх залежності. Ви можете зробити такий інсталятор за допомогою InnoSetup, NSIS, WIX або різних інших інструментів.

Можна зробити виконавчі файли, які не потребують перерозподілу, але ви обмежилися лише підмножиною основних функціональних можливостей Windows, чого, як правило, недостатньо для створення будь-якої змістовної гри або великого застосування. Самі інсталятори є прикладом програм, яким не потрібні ніякі залежності.


Чи можливо використовувати VS для створення такого інсталятора? Я думав, що один раз бачив щось, що називається OneClick, в налаштуваннях проекту.
user1306322

@ user1306322: абсолютно одне рішення було зазначено в коментарях Gizmo. Це лише питання про те, з якими програмами виконання / DLL ви посилаєтесь. У налаштуваннях за замовчуванням ви посилаєтесь на специфічну для версії CRT DLL, але це можна змінити, відключивши параметри лінкера. Просто встановіть посилання на MSVCRT.DLL(додається до самої Windows) замість MSVCPxxx.DLL(конкретні версії, що входять до версій Visual Studio).
Шон Міддлічч

Або якщо ви маєте на увазі створення повноцінного інсталятора, це в основному WIX . Це типовий надскладний XML-важкий crapfest Microsoft, але він працює. Раніше були "проекти інсталятора", хоча я вважаю, що їх немає з 2013 або 2015 року
Шон Міддлічч

7

Я використовую Denderpend Walker для відстеження відсутніх DLL-файлів:

Dependency Walker також дуже корисний для усунення помилок у системі, пов’язаних із завантаженням та виконанням модулів. Dependency Walker виявляє багато поширених проблем із додатками, такі як відсутні модулі, недійсні модулі, невідповідність імпорту / експорту, помилки кругової залежності, невідповідні типи машин та збої ініціалізації модулів.


Існує також варіант часу компіляції в VS для статичного зв’язку DLL:

  • Статично пов'язані засоби означають, що DLL-файли включаються у файл EXE.
  • Статичне посилання збільшує розмір файлу EXE.
  • Статичне посилання означає, що ця версія DLL завжди буде використовуватися.
  • Однак статичне посилання також означає, що ви ніколи не матимете проблеми з відсутніми DLL-адресами.

1
Залежник ходок досить старий. Він більше не імітує механізми Windows для завантаження DLL. Часто призводить до помилкових повідомлень про неможливість пошуку DLL-файлів.
jpmc26

І статичне посилання може бути заборонене в ліцензії залежності.
KeyWeeUsr

6

Для Visual C ++ у вас є кілька варіантів, як обробити перерозподіл: запустіть EXE зі свого інсталятора (з правами адміністратора), використовуйте модуль злиття MSM зі своїм інсталятором MSI або навіть бічні сторонні DLL. Деталі див. У MSDN .

Більша проблема - OpenGL. Єдиною версією OpenGL, яка входить у Windows, є програмний рендер OpenGL 1.5. Все інше вимагає встановлення стороннього МКБ.

Це одна з причин, чому так багато ігор Windows використовують DirectX замість того, що вона включена в операційну систему. Див. Розділ Direct3D 11 Розгортання для розробників ігор та не настільки пряме налаштування .


1
Порада OpenGL застаріла - кожен сучасний графічний драйвер має сучасний ICD OpenGL.
користувач253751

Мені особисто довелося встановлювати відкриті DLL-
файли

@Gnemlock Одразу після перевстановлення Windows на згаданий річний комп'ютер, можливо, ви матимете рацію. Ви продовжували бачити цю проблему після встановлення офіційного пакета драйверів від NVIDIA, AMD або Intel?
Damian Yerrick

2
@Gnemlock - якщо ви вручну встановлюєте DLL-файли OpenGL, ви робите щось жахливе неправильно. Якщо ви насправді маєте на увазі «встановити драйвер свого постачальника графічних процесорів», це саме те, що саме сказав immibis.
Максим Мінімус

@Gnemlock - ах, так що не стосується реального світу тоді. Дякуємо, що очистили це.
Максим Мінімус

1

Відмова: Це рішення , а не рішення вашої відповіді, але все-таки дуже життєздатна можливість.

Якщо ви хочете бути абсолютно впевненими, що від самого VS немає залежностей - але це має свої власні недоліки - у налаштуваннях генерації коду ви можете скористатися функцією Multi Threaded (MT) / Multi Threaded Debug (MD) (для налагодження налагодження ) замість MT DLL (MTd) / MT Debug DLL (MDd).

введіть тут опис зображення

Які недоліки?

  • Це збільшує розмір виконуваного файлу та ваш бінарний (хоча якщо ви робите гру, це, мабуть, незначно)
  • складений таким чином, не матиме користі від оновлень dll часу виконання. (наприклад, якщо Microsoft випускає VC ++ 2015 SP2, SP3, SP4 тощо). Але це залежить від вас.
  • Більше використання оперативної пам’яті (також мізерно), оскільки ви не використовуєте повторно існуючий / завантажений код (DLL)
  • Ви повинні бути впевнені, що всі бібліотеки, до яких ви посилаєтеся, зібрані в один і той же час виконання, інакше посилання може бути невдалим, або можуть виникнути цікаві помилки виконання (напевно, ні, але це сталося зі мною один раз у житті в застарілому проекті, який оновлено до найновіший VS)

А які плюси?

  • у вашому виконуваному файлі не буде "зовнішніх" залежностей від самого VS (відсутність вимоги msvc * .dll).
  • деякі люди сприймають це як підвищення продуктивності, оскільки ви виключаєте накладні витрати на виклики DLL, хоча це теоретично вірно, поліпшення на практиці незначні

Перевірте це посилання, щоб отримати більш детальне пояснення, а також можливі помилки та падіння, які можуть виникнути при використанні статичного часу виконання.

Іншим вирішенням цього питання є те, щоб помістити всі необхідні DLL-файли, де знаходиться ваш бінарний файл. Ваша програма не отримає користі від оновлень (до бібліотек виконання), але це все.

Справжнє рішення полягає в тому, щоб розподілити додаток у режимі DLL випуску / не налагодження (MTd) та поставити правильний інсталятор VC ++, який можна перерозподілити (та будь-який інший інсталятор бібліотеки, який ви можете використовувати, наприклад, OpenAL, DirectX9, PhysX), і дозволити користувачеві запускати це перед запуском програми (як вказано на інші відповіді).

Також обов’язково повідомте користувачеві, що йому, можливо, необхідно оновити свої драйвери графічного процесора (оскільки вони містять декілька режимів виконання для багатьох додатків, наприклад, OpenGL, Vulcan).


0

Моє рішення полягало в тому, щоб скопіювати та вставити DLL, що спричинило помилку, у папку, де знаходиться файл .sln у візуальній студії. Після #includeрозділу я написав #pragma comment (lib, "lost DLL name with .dll")і вирішив!

Примітка. Я вирішив проблему, з якою зіткнувся з сторонньою бібліотекою (vulkan api) DLL. Можливо, це не відомо, але 90% пощастить :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.