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;
}
Ответы
Ответ 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 пытаются пересобрать проект. У меня была та же проблема, но перестройка моего проекта помогла решить проблему.