1. ホーム
  2. c++

[解決済み] MinGW .exe は、コードに関係なく、いくつかの gcc dll を必要としますか?

2022-02-19 23:29:05

質問内容

MinGWでコンパイルする場合、MinGWのbinディレクトリから特定のdllファイルをコピーしないとexeが実行されません("-static"や"-static-libstdc++"を使用してもです)。 どうすれば変更できますか?私が使用しなければならないMinGWの特別なビルドがあるのでしょうか?最終的には、ディレクトリにexe以外何もない状態でプログラムを実行できるようにしたいのです(Windows環境変数の設定もありません)。

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

そして、以下が私が行った手順の完全なリストです。

  1. Code::Blocksを開く
  2. File->New->Project->Console" を選択します。
  3. プロジェクト「"Hello World"」のプロジェクト設定を入力します。
  4. プロジェクトを右クリック->ビルドオプション...->Hello World (Root target)->Other Options
  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. MinGW/bin/ディレクトリから "libstdc++-6.dll" を "Hello World.exe" ディレクトリにコピーしてください。
  10. Hello World.exeを実行します。
  11. Error: libgcc_s_seh-1.dll is missing from your computer." というメッセージに対して "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;
}

解決方法は?

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

のあるディレクトリに移動してください。 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")