Програма не може запуститися, оскільки відсутній libgcc_s_dw2-1.dll


166

Я створив просту програму на C ++ за допомогою Code :: Blocks.

Якщо я запускаю його з Code :: Blocks, він працює правильно; але якщо я запускаю його, двічі клацнувши на виконуваний файл, з'явиться вікно з цим повідомленням:

Програма не може запуститися, оскільки на комп'ютері відсутній libgcc_s_dw2-1.dll.
Спробуйте перевстановити програму, щоб усунути цю проблему.

Отже, в чому проблема? Що мені потрібно зробити, щоб виправити це?

Відповіді:


196

Я вважаю, що це проблема компілятора MinGW / gcc, а не налаштування Microsoft Visual Studio.

Значення libgcc_s_dw2-1.dllповинно знаходитись у директорії бін компілятора. Ви можете додати цей каталог до змінної середовища PATH для посилання на час виконання, або ви можете уникнути проблеми, додавши "-static-libgcc -static-libstdc ++" до ваших прапорів компілятора.

Якщо ви плануєте поширювати виконуваний файл, останній, мабуть, має найбільш сенс. Якщо ви плануєте запускати його лише на своїй машині, зміна змінної середовища PATH є привабливим варіантом (зменшує розмір виконуваного файлу).

Оновлено:

На основі відгуків Грега Трелівена (див. Коментарі нижче) я додаю посилання на:

[Скріншот коду :: Блоки "Параметри побудови проекту"]

[Параметри посилання GNU gcc]

Останнє обговорення включає -static-libgccі -static-libstdc++варіанти лінкера.


У мене така ж проблема, що і в @xRobot, і я не міг ніде знайти, щоб додати речі до прапорів компілятора, тому я спробував додати її до інших параметрів, потім до опцій Linker, і повідомлення про помилку все-таки відбулося. Чи щось не так у тому, що я роблю?
Грег Трелівен

@Greg Treleaven: Просто для наочності ви створюєте виконуваний файл за допомогою Code :: Block, він працює як очікується всередині IDE, але повідомляє про помилку "не може початися, оскільки libgcc_s_dw2-1.dll відсутній", коли ви намагаєтеся запустити його за межами IDE. Ви перевірили каталог бін компілятора, і так, ця DLL насправді є. Ви намагаєтеся виправити проблему, зробивши статичну зв'язок, яка витягує зібраний код з бібліотеки, тому DLL (посилання для виконання) не потрібне, але воно не працює. Дві пропозиції: Складіть чисту збірку (зміна параметрів може не викликати відновлення) та спробуйте додати змінну PATH.
хардмат

@hardmath: Після чистої перебудови все ще не працює, тому, мабуть, мені доведеться скористатися одним із інших способів виправити це. Дякуємо за допомогу.
Грег Трелівен

@Greg Treleaven: Причина намагатися додати каталог бін компілятора до вашої PATH полягає в тому, щоб показати (якщо це робить роботу), що виконуваний файл все ще будується для зв'язку між часом виконання стандартних бібліотек (DLL). Я думаю, що проблема полягає в тому, і нам потрібно знайти (якщо ви хочете зробити статичний зв’язок коду бібліотеки), де розмістити прапори компілятора.
хардмат

4
Ця дискусія продовжується (і вирішується) тут .
David C

37

У програмі Eclipse ви знайдете його під властивостями проекту> C / C ++ Build> Налаштування> MinGW C ++ Linker> Різне

Ви повинні додати його до "прапорів лінкерів" вгорі; ніде більше. Тоді просто відбудуйте.

Скріншот властивостей затемнення

Я виявив, що з'єднання цих статично вибухає розміром до 1400 кб навіть за допомогою оптимізації. Це на 277 кб більше в порівнянні з просто копіюванням спільних DLL-файлів. Це також на 388kb більше після UPXing всього. Тут дуже програють / програють. Просто включіть DLL, оскільки кінцевий користувач може вирішити видалити їх чи ні, якщо вони встановлені в іншому місці.


1
Чи є спосіб уникнути додавання прапора посилання у кожен новостворений проект?
Роджер Нг

Читачам: Будь ласка, зверніть увагу на параметри, додані до зображення. Це працює. Це допомагає як довідка: orfe.princeton.edu/help/article-296
PALEN

10

Код :: Блоки: додайте "-статичний" у налаштуваннях-> компілятор-> Налаштування Linker-> Інші параметри лінкера.


1
Це прекрасно працювало для мене щодо "пропущеного" dll за заголовком, це так швидко і просто, я б рекомендував спершу спробувати.
Пол Конноллі

Найкраще рішення!
iyy0v

6

Знайдіть цей dll на своєму ПК та скопіюйте його в ту саму каталог, у якому виконується ваш виконуваний файл.


чому цього не відбувається з візуальною студією?
xRobot

1
Це також робить, але з іншими dll. Приклади, якщо вам НЕ вистачає msvcrt90.dll, зоровий складений проект не запускається (ІТ, як правило , встановлена система широко , хоча)
Брюс

6

Дивіться також . Це вирішило мою проблему.

До речі, це напевно compilerпрапор? Може, тут linkerє більш підходящий термін?


1
+1 за правильну термінологію! Так, моє "посилання" на параметри посилання gcc було втіленням цього (для статичних бібліотек).
hardmath

5

Скопіюйте "libgcc_s_dw2-1.dll", щоб було make.exe є. (Якщо ви використовуєте Msys, скопіюйте його в \ msys \ bin) Переконайтеся, що шлях до make.exe встановлений у env. PATH (якщо make.exe знаходиться в папці "бін", швидше за все, і у вас є msys, це \ msys \ bin) Компілюйте, виконайте налагодження, налагодження тощо.


5

Перейдіть до дерева MinGW http sourceforge.net. У розділі Головна / MinGW / Base / gcc / Version4 (або будь-якій версії, яку ви використовуєте) / gcc-4 (версія) / ви знайдете файл на зразок gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Витягніть його та перейдіть у папку bin, де ви знайдете ваші libgcc_s_dw2-1.dll та інші dll. Скопіюйте та вставте те, що вам потрібно, у свій каталог сміття.


5

Мені вдалося подолати це, використовуючи "gcc" замість "g ++" для мого компілятора. Я знаю, що це не варіант для більшості людей, але я подумав, що згадую це як варіант вирішення :)


4

Ви не можете помістити його в system32 або щось подібне до інших файлів dll, так що кожна програма, яку ви намагаєтеся запустити, не матиме такої проблеми на вашій машині?

Мені просто потрібен шлях, куди його поставити.

Як би це було прикро, вводити його в каталог кожен раз, коли я запускаю програму, яку я тільки що створив ...

Редагувати: Я знайшов рішення:

Витягніть libgcc_s_dw2-1.dll до місця на вашому комп’ютері. Ми рекомендуємо розпакувати його до каталогу програми, яка запитує libgcc_s_dw2-1.dll.

Якщо це не працює, вам доведеться витягнути libgcc_s_dw2-1.dll в системний каталог. За замовчуванням це:

  • C: \ Windows \ Система (Windows 95/98 / Me)
  • C: \ WINNT \ System32 (Windows NT / 2000)
  • C: \ Windows \ System32 (Windows XP, Vista, 7)

Якщо ви використовуєте 64-бітну версію Windows, вам також слід розмістити libgcc_s_dw2-1.dll в C: \ Windows \ SysWOW64 \

Переконайтесь, що перезапишіть усі наявні файли (але зробіть резервну копію оригінального файлу). Перезавантажте комп'ютер.

Якщо проблема все-таки виникає, спробуйте наступне:

  • Відкрийте меню «Пуск Windows» і виберіть «Запустити ...».
  • Введіть CMD і натисніть Enter (або якщо ви використовуєте Windows ME, введіть COMMAND)).
  • Введіть regsvr32 libgcc_s_dw2-1.dll і натисніть Enter.

12
Тут не публікуйте коментарів як відповідей. Так не працює переповнення стека. Ви також не будете далеко використовувати "U" замість "ви" та "cos" замість "тому". Тут спілкуватися в чаті спеціально заборонено.
meagar

4

Просто перейдіть у Налаштування >> Компілятор та налагоджувач, потім перейдіть на вкладку "Налаштування Linker" та перейдіть до "Редагувати параметр" Інші параметри лінкера "та вставте на нього:" -static-libgcc -static-libstdc ++ ", немає опції прапора компілятора у параметрах прапорців компілятора для Code :: Блоки, тож це спосіб вирішити цю проблему, я також прийшов сюди шукати рішення, і той хлопець, який розмістив повідомлення про "-static-libgcc -static-libstdc ++", дав правильну ідею, і Я розібрався з рештою випадково, але це спрацювало, файл можна зараз натискати ззовні Код :: Блоки, працює прямо з робочого столу.


3

Додайте шлях до цього dll в змінну середовища PATH.


чому цього не відбувається з візуальною студією?
xRobot

Можливо, тому, що шлях до цього dll перерахований у інструментах VisualStudio -> Параметри-> Проекти та рішення -> Каталоги VC ++ -> Виконані файли. Visual Studio шукає тут і в змінній середовища PATH під час пошуку шляхів до dll.
Боян Комажець

2

Включення -static-libgcc у рядок компіляції вирішує проблему

g++ my.cpp -o my.exe -static-libgcc

Відповідно до: @hardmath

Ви також можете створити псевдонім у своєму профілі [.profile], наприклад, якщо ви в MSYS2

alias g++="g++ -static-libgcc"

Тепер ваша команда GCC також проходить через ;-)

Перезавантажте термінал


1

Додавання "-static" до інших параметрів лінкера вирішує цю проблему. У мене виникло те саме питання після того, як я протестував це в іншій системі, але не самостійно, тому навіть якщо ви цього не помітили у вашій системі розробки, вам слід перевірити, чи є у вас цей набір, якщо ви статично зв’язуєтесь.

Ще одна примітка: копіювання DLL в ту ж папку, що і виконуваний файл, не є рішенням, оскільки воно перешкоджає ідеї статичного посилання.

Інший варіант - використовувати TDM-версію MinGW, яка вирішує цю проблему.

Оновлення редагування: це може не вирішити проблему для всіх. Ще одна причина, яку я нещодавно виявив для цього, - це коли ви використовуєте бібліотеку, складену кимось іншим, у моєму випадку це був SFML, який був неправильно складений, і тому потрібна DLL, яка не існувала, оскільки вона була складена з іншою версією MinGW, ніж те, що я використання. Я використовую карликову збірку, ця використовувала іншу, тому я ніде не мав DLL, і, звичайно, я не хотів цього, оскільки це була статична збірка. Рішенням може бути пошук іншої збірки бібліотеки або побудова її самостійно.


0

Працюючи з msys2, я отримав ту саму помилку, намагаючись виконати версію мого проекту в середовищі налагодження. Рішення для моєї проблеми очевидне: використовуйте виконуваний файл із символами налагодження.


0

У CodeBlocks ви можете перейти в Налаштування ... Компілятор ... і вибрати або 1) два елементи у синьому полі або 2) один елемент у зеленому полі

налаштування компілятора кодових блоків


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