Программа не может запуститься, потому что отсутствует 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, и я нигде не мог найти, что добавить в флаги компилятора, поэтому я попытался добавить его в «Другие параметры», затем «Параметры компоновщика», и сообщение об ошибке все равно появилось. Что-то не так с тем, что я делаю?
Грег Трелевен

@Greg Treleaven: просто для ясности вы создаете исполняемый файл с Code :: Block, он работает как и ожидалось внутри IDE, но сообщает об ошибке «не может запуститься, потому что отсутствует libgcc_s_dw2-1.dll» при попытке запустить его вне IDE. Вы проверили каталог bin компилятора, и да, эта DLL на самом деле там. Вы пытаетесь решить проблему, выполняя статическое связывание, которое извлекает скомпилированный код из библиотеки, поэтому DLL (связывание во время выполнения) не нужна, но она не работает. Два предложения: сделать чистую сборку (изменение параметров может не вызвать перестроение) и попробуйте добавить переменную PATH.
hardthth

@hardmath: После чистой перестройки все еще не работает, поэтому, думаю, мне придется использовать один из других способов, чтобы это исправить. Спасибо за помощь.
Грег Треливен,

@Greg Treleaven: причина попытаться добавить каталог bin компилятора в ваш PATH, чтобы показать (если это заставляет вещи работать), что исполняемый файл все еще создается для связывания во время выполнения стандартных библиотек (DLL). Я думаю, что проблема в том, и нам нужно найти (если вы хотите сделать статическое связывание библиотечного кода), где разместить флаги компилятора.
hardthth

4
Это обсуждение продолжается (и решается) здесь .
Дэвид С.

37

В Eclipse вы найдете его в свойствах проекта> Сборка C / C ++> Настройки> MinGW C ++ Linker> Разное

Вы должны добавить его в «флаги компоновщика» вверху; нигде более. Тогда просто восстановите.

Скриншот свойств Eclipse

Я обнаружил, что связывание этих статически взрывает размер до 1400 КБ даже с оптимизацией. Это на 277 КБ больше по сравнению с простым копированием общих библиотек DLL. Это также на 388 КБ больше после UPXing. Очень потерять / проиграть здесь. Просто включите библиотеки DLL, так как конечный пользователь может решить удалить их или нет, если они установлены в другом месте.


1
Есть ли способ избежать добавления флага компоновщика в каждом новом проекте?
Роджер Нг

Читателям: обратите внимание на опции, добавленные на картинке. Это работает. Это помогает в качестве ссылки: orfe.princeton.edu/help/article-296
PALEN

10

Code :: Blocks: добавить '-static' в настройках-> компилятор-> настройки компоновщика-> другие опции компоновщика.


1
Это отлично сработало для меня в отношении «отсутствующих» dll в названии, это так быстро и просто, что я бы рекомендовал сначала попробовать этот.
Пол Коннолли

Лучшее решение !
iyy0v

6

Найдите эту dll на вашем ПК и скопируйте ее в тот же каталог, в котором находится ваш исполняемый файл.


почему это не происходит с visual studio?
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 находится в папке «bin», скорее всего, и у вас есть msys, это \ msys \ bin) Компиляция, запуск, отладка и т. Д. Счастливы.


5

Перейдите к дереву MinGW http sourceforge.net. В папке Home / MinGW / Base / gcc / Version4 (или любой другой версии, которую вы используете) / gcc-4 (версия) / вы найдете файл типа gcc-core-4.8.1-4-mingw32-dll.tar.lzma , Извлеките его и перейдите в папку bin, где вы найдете свой libgcc_s_dw2-1.dll и другие библиотеки DLL. Скопируйте и вставьте то, что вам нужно, в каталог bin.


5

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


4

Разве вы не можете поместить его в system32 или что-то вроде того, что делаете с другими dll-файлами, чтобы каждая программа, которую вы пытаетесь запустить, не имела такой проблемы на вашем компьютере?

Мне просто нужен путь, где его поставить.

Довольно неприятно помещать его в каталог каждый раз, когда я запускаю только что созданную программу ...

Изменить: я нашел решение:

Извлеките libgcc_s_dw2-1.dll в папку на вашем компьютере. Мы рекомендуем вам распаковать его в каталог программы, которая запрашивает libgcc_s_dw2-1.dll.

Если это не сработает, попробуйте извлечь libgcc_s_dw2-1.dll в системную директорию. По умолчанию это:

  • C: \ Windows \ System (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
Пожалуйста, не оставляйте комментарии в качестве ответов здесь. Это не то, как работает переполнение стека. Вы также не будете далеко ходить, используя «и» вместо «вы» и «потому что» вместо «потому что». Чат говорить здесь специально запрещен.
Meagar

4

Просто зайдите в «Настройки» >> «Компилятор и отладчик», затем перейдите на вкладку «Настройки компоновщика» и перейдите к элементу «Редактировать другие параметры компоновщика» и вставьте в него «-static-libgcc -static-libstdc ++», здесь нет опции флага компилятора в параметрах флагов компилятора для Code :: Blocks, так что это способ решения этой проблемы, я пришел сюда в поисках решения, и один парень, который писал о "-static-libgcc -static-libstdc ++" дал правильную идею, и Я как-то разобрался с остальным, но это сработало, теперь файл можно кликнуть снаружи Code :: Blocks, работает прямо с рабочего стола.


3

Добавьте путь к этой DLL в переменную окружения PATH.


почему это не происходит с visual studio?
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 в ту же папку, что и исполняемый файл, не является решением, так как она отрицает идею статической компоновки.

Другой вариант - использовать версию MinGW для TDM, которая решает эту проблему.

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


0

Работая с msys2, я получил ту же ошибку, пытаясь выполнить релиз-версию моего проекта в среде отладки. Решение моей проблемы очевидно: используйте исполняемый файл с символами отладки.


0

В CodeBlocks вы можете перейти в Настройки ... Компилятор ... и выбрать 1) два элемента в синем поле или 2) один элемент в зеленом поле

настройки компилятора кодовых блоков


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.