2013-08-09 8 views
38

MinGWでコンパイルするときに、 "-static"や "-static-libstdC++"を使用していても、exeファイルを実行する前にMinGWのbinディレクトリから特定のdllファイルをコピーする必要があります。 どうすれば変更できますか? ? MinGWの特別なビルドが必要ですか?最終的に私は、ディレクトリ内のexeファイルが、何もしてプログラムを実行できるようにしたい(とは窓の環境変数が設定されていません。)これらのファイルのされていますMinGW .exeはコードに関係なく数gccのDLLを必要としますか?

  • のlibstdC++ - libgcc_s_seh-1.dll現在6.dll
  • libwinpthread-1.dll現在

そして、ここでは、私は休耕ステップの完全なリストである:

  1. オープンアップコード::ブロック
  2. を選択し、 "ファイル - >新規作成>プロジェクト - >コンソール"
  3. の "Hello World" プロジェクトのプロジェクト設定を記入
  4. 右...->のHello World(ルートターゲットプロジェクト - >はオプションのビルド]をクリックします) - >その他のオプション
  5. すでに設定されている "-fexceptions"
  6. CTRL-F9下) "-static"(または "-static-のlibstdC++" を入力します。実行せずにプロジェクトを(ビルド)
  7. 移動するには、中Windows Explorerを起動し、ビルドされた "Hello World.exe"ファイルを実行します。
  8. 「エラー:libstdC++ - 6.dllがコンピュータに存在しません」というメッセージが表示されたら「OK」をクリックしてください。
  9. /MinGW/bin /ディレクトリの "libstdC++ - 6.dll"を "Hello World.exe"ディレクトリにコピーします。
  10. "Hello World.exe"を実行してください
  11. "エラー:libgcc_s_seh-1.dllがコンピュータに存在しません"というメッセージが表示されたら、[OK]をクリックします。
  12. "Hello World.exe"ディレクトリに "libgcc_s_seh-1.dll"をコピーします。
  13. 「libwinpthread-1.dll」を繰り返しコピーして終了します。
  14. ビューメッセージが

    Hello World! 
    

編集: は私のコマンドラインは次のとおりです。必要な上記のすべてのdllファイルと

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 

。そして、念のために、コードは次のとおりです。

// main.cpp 
#include <iostream> 

using namespace std; 

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

と書いています。あなたがしたいことは、すべてを1つの再配置可能な実行可能ファイルにまとめることです。 – 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 

あなたは、もはや(あなたのHello Worldプログラムのための)DLLをコピーする必要がありませんよ。

その他の注意事項:

MinGWのインストール手順は、PATH環境変数に

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

を設定することをお薦めします。

リンカオプションが動作するはず

通常

-static -static-libgcc -static-libstdc++ 
(一度にそれらのすべて3を試してみてください)。しかし、 libwinpthread-1.dllではありません。

さらに、再コンパイルする前にcleanを試してください。

"-static-something"コマンドはありません。

のみ標準ライブラリのlibgccのlibstdC++は、静的リンクに設定することができます。

他のライブラリの場合は、最初に静的なリンクを "-static"に切り替えてから、ライブラリに別々のコマンド( "-lpthread"など)を含めるようにリストします。

+1

彼はおそらくアプリケーションを配布したいので、クライアントがMinGWをインストールしたり、環境変数を変更したりすることを望まないからです。 – Praetorian

+0

@Praetorian:これは開発環境です。 OPが顧客に提供したい場合、彼は必要なすべてのDLLをセットアップファイルと共にパックしなければならない。しかし、それは唯一の 'Hello World'テストのようです。したがって、必要なファイルを見つけられないフォルダに入れないのはかなり愚かなことでしょう。 downvoteのためにかなり曖昧です。 –

+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.

関連する問題