web-dev-qa-db-ja.com

MinGW .exeには、コードに関係なくいくつかのgcc dllが必要ですか?

MinGWでコンパイルする場合、exeを実行する前にMinGW binディレクトリから特定のdllファイルをコピーする必要があります(「-static」および/または「-static-libstdc ++」を使用している場合でも)。使用しなければならないMinGWの特別なビルドはありますか?最終的には、ディレクトリ内のexeのみでプログラムを実行できるようにしたい(そして、Windows環境変数は設定しない)。これらのファイルは次のとおりです。

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

そして、ここに私が休閑しているステップの完全なリストがあります:

  1. Code :: Blocksを開く
  2. 「ファイル->新規->プロジェクト->コンソール」を選択します
  3. プロジェクト「Hello World」のプロジェクト設定を入力します
  4. プロジェクト->ビルドオプション...-> Hello World(ルートターゲット)->その他のオプションを右クリックします。
  5. 設定済みの「-fexceptions」の下に「-static」(または「-static-libstdc ++」)を入力します
  6. CTRL-F9:プロジェクトのビルド(実行なし)
  7. Windowsエクスプローラーに移動し、ビルドされた「Hello World.exe」ファイルを実行します。
  8. 「Error:libstdc ++-6.dll is missing from your computer」というメッセージがポップアップ表示されたら、「OK」をクリックします。
  9. 「libstdc ++-6.dll」を/ MinGW/bin /ディレクトリから「Hello World.exe」ディレクトリにコピーします。
  10. 「Hello World.exe」を実行します
  11. 「エラー:libgcc_s_seh-1.dllがコンピューターにありません」というメッセージに対して「OK」をクリックします。
  12. 「libgcc_s_seh-1.dll」を「Hello World.exe」ディレクトリにコピーします。
  13. 繰り返し、「libwinpthread-1.dll」もコピーします。
  14. メッセージを見る

    Hello World!
    

編集:私のコマンドラインは:

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;
}
49
Wolfgang Skyler

コマンドが間違っている!

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のインストール手順では、設定を推奨しています

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

pATH環境変数に。

通常

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

リンカオプションは機能するはずです(一度に3つすべてを試してください)。しかし、libwinpthread-1.dll

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

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

静的リンクに設定できるのは、標準ライブラリlibgccおよびlibstdc ++のみです。

他のライブラリの場合、最初に「-static」を使用して静的リンクに切り替え、次に「-lpthread」などの個別のコマンドで含めるライブラリをリストします。

Cmakeユーザーは追加してみてください:

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

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

-static-libgccは、例外が使用される場合、悪い考えかもしれません。 リンクオプションのドキュメント

アプリケーションが静的バージョンの代わりに共有libgccを使用する必要がある状況がいくつかあります。これらの最も一般的なのは、アプリケーションが異なる共有ライブラリ全体で例外をスローおよびキャッチしたい場合です。その場合、各ライブラリとアプリケーション自体は共有libgccを使用する必要があります。

8
J.J. Hakala

Code :: Blocksはプロジェクトを再構築しようとするので、人々はまだこの問題にこだわっています。私も同じ問題を抱えていましたが、プロジェクトを再構築することで問題を解決できました。

0
Uwohm9