2013-08-09 2 views
38

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

  • libstdC++ - 6.dll
  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll

А вот полный список СТЭПА я залежный:

  1. Открывает Code :: Blocks
  2. Выберите "File-> New-> Project> Консоль"
  3. Заполните параметры проекта для проекта "Hello World"
  4. правой кнопкой мыши Project> Build Options ...-> Hello World (Root цель) -> Другие варианты
  5. Enter "-static" (или "-static-libstdC++") под уже установленных "-fexceptions"
  6. CTRL-F9: Build Project (без выполнения)
  7. Перейдите, в Windows Explorer и запустить встроенный файл Hello World.exe.
  8. Нажмите «ОК», когда появится сообщение «Ошибка: libstdC++ - 6.dll отсутствует на вашем компьютере».
  9. Скопируйте «libstdC++ - 6.dll» из каталога/MinGW/bin/в каталог «Hello World.exe».
  10. Запустить «Hello World.exe»
  11. Нажмите «ОК» для сообщения «Ошибка: libgcc_s_seh-1.dll отсутствует на вашем компьютере».
  12. Скопируйте "libgcc_s_seh-1.dll" в папку "Hello World.exe".
  13. Повторите и завершите копирование «libwinpthread-1.dll» поверх.
  14. просмотреть сообщение

    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; 
} 
+0

Звучит так, как будто вы хотите объединить все в единый перемещаемый исполняемый файл. – Jiminion

+0

Я бы построил его вне блоков кода. Вам нужно увидеть команду сборки. – Jiminion

ответ

30

Ваши команды ошибаетесь!

Перейдите в каталог, где находится ваш файл 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.

Нет команды «-статический-что-то».

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

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

+1

Поскольку он, вероятно, хочет распространять приложение и не хочет, чтобы клиенты должны были устанавливать MinGW или изменять переменные окружения – Praetorian

+0

@Praetorian: Это среда разработки. Если OP хочет дать своим клиентам, он все равно должен упаковать все необходимые DLL с установочным файлом. Но похоже, что это только тесты «Hello World». Поэтому было бы довольно глупо не иметь требуемые файлы в папке, где они могут быть найдены. Для нисходящего потока это довольно расплывчато. –

+2

* В конечном счете, я хочу, чтобы у меня была возможность запускать программу без ничего, кроме exe в каталоге * ... похоже, что упаковка DLL не является именно тем, что он хочет делать. Это должно быть возможным, если существуют версии статической библиотеки для всех библиотек времени исполнения. – Praetorian

5

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

There are several situations in which an application should use the shared libgcc instead of the static version. The most common of these is when the application wishes to throw and catch exceptions across different shared libraries. In that case, each of the libraries as well as the application itself should use the shared libgcc.