Подтвердить что ты не робот

MinGW.exe требует несколько gcc dll независимо от кода?

При компиляции с MinGW мне нужно скопировать определенные файлы DLL из каталога bin MinGW до запуска exe (даже при использовании "-статического" и/или "-статического-libstdС++".) Как мне это изменить? Есть ли специальная сборка MinGW, которую я должен использовать? В конечном счете, я хочу, чтобы у меня была возможность запускать программу только с помощью exe в каталоге (и не заданы переменные среды Windows). Эти файлы:

  • libstdС++ - 6.dll
  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll

И вот полный список шагов, которые я подхожу:

  • Открыть код:: Блокировки
  • Выберите "Файл- > Создать- > Проект- > Консоль"
  • Заполните настройки проекта для проекта "Hello World"
  • Щелкните правой кнопкой мыши Project- > Параметры сборки...- > Hello World (Корневая цель) → Другие параметры
  • Введите "-статический" (или "-static-libstdС++" ) в соответствии с уже установленными "-fexceptions"
  • CTRL-F9: проект сборки (без выполнения)
  • Перейдите в Windows Explorer и запустите встроенный файл Hello World.exe.
  • Нажмите "ОК", когда появится сообщение "Ошибка: libstdС++ - 6.dll отсутствует на вашем компьютере".
  • Скопируйте "libstdС++ - 6.dll" из каталога/MinGW/bin/в каталог "Hello World.exe" .
  • Запустите "Hello World.exe"
  • Нажмите "ОК" для сообщения "Ошибка: libgcc_s_seh-1.dll отсутствует на вашем компьютере".
  • Скопируйте файл libgcc_s_seh-1.dll в каталог "Hello World.exe" .
  • Повторите и завершите копирование файла libwinpthread-1.dll.
  • Просмотр сообщения

    Hello World!
    

Edit: Моя командная строка:

g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o
g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o

При наличии всех файлов dll, указанных выше. И, чтобы быть в безопасности, код:

// main.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
4b9b3361

Ответ 1

Ваши команды неверны!

Перейдите в каталог, где находится файл main.cpp, и попробуйте следующее.

g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o
g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o

тогда вам больше не нужно копировать библиотеки DLL (для вашей программы Hello World).

Другие заметки:

Инструкция по установке MinGW рекомендует установить

c:\minGW;c:\MinGW\bin;

к переменной среды PATH.

Обычно

-static -static-libgcc -static-libstdc++

должны работать опции компоновщика (попробуйте все 3 из них одновременно). Но не для libwinpthread-1.dll.

Также попробуйте clean перед перекомпиляцией.

Там нет команды "-static -что-то".

Только стандартные библиотеки libgcc и libstdc++ могут быть установлены на статическое связывание.

Для других библиотек вы сначала переключаетесь на статическое связывание с помощью "-static", а затем перечисляете библиотеки для включения с помощью отдельных команд, то есть "-lpthread".

Пользователи Cmake должны попробовать добавить:

set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CSS_STANDARD_LIBRARIES}")

set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")

Ответ 2

-static-libgcc может быть плохой идеей, если используются исключения. документация по ссылкам указывает, что

Существует несколько ситуаций, в которых приложение должно использовать shared libgcc вместо статической версии. Наиболее распространенные из них когда приложение хочет бросить и поймать исключения в разные общие библиотеки. В этом случае каждая из библиотек как так как само приложение должно использовать общий libgcc.

Ответ 3

Люди до сих пор застряли с этой проблемой, в Code :: Blocks пытаются пересобрать проект. У меня была та же проблема, но перестройка моего проекта помогла решить проблему.