ここからmingwを使用します:http://sourceforge.net/projects/mingwbuilds/files/Host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/download
そして、libstdc++-6.dll
パラメーターを使用して、静的にlibgcc_s_sjlj-1.dll
と-static-libgcc -static-libstdc++
をリンクすることに成功しましたが、libwinpthread-1.dll
で同じことを行うコマンドが見つかりません。
GCCのコマンドラインオプションのドキュメントを確認してください。
これらは「-static-something」コマンドではなく、1つのコマンドで静的リンクに設定できるのは標準ライブラリ(libgccおよびlibstdc ++)のみです。他のライブラリの場合、最初に「-static」を使用して静的リンクに切り替え、次に「-lpthread」などの個別のコマンドで含めるライブラリをリストします。
ツールチェーンに静的winpthreadsが含まれている場合、オプションを追加します
-static
可能なすべてのライブラリの静的バージョンをプルします。
または、libwinpthread.dll.aとDLL自体をツールチェーンディレクトリから削除することもできます。これにより、libstdc ++およびlibgcc DLLとリンクするプログラムが混乱する可能性がありますので、注意してください。
3番目のオプションは、-Wl,-Bdynamic
および-Wl,-Bstatic
を使用して、リンクするバージョンを選択することです(ldが呼び出されたときに-static
が内部的に行うことです)。例:
gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic
-v
を追加してリンクコマンドを実行する場合、-static-libgcc
および-static-libstdc++
を使用すると、ld/collect2の呼び出しにこれらのオプションが表示されます。
これを試して:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
-lstdc++
の前の-lpthread
に注意してください。それは私のために働いた。
g++
コマンドラインの最後に必ず追加してください。
プログラムでスレッドが使用されていない場合でもwinpthreadを静的にリンクするには、-Bstatic
および--whole-archive
リンカーへのパラメーター:
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
次のことに注意してください。
<thread>
C++ 11から)、この場合、静的にリンクしてもライブラリは削除されません。CMakeで作業している人は誰でも、このソリューションは次のようにCMakeLists.txtファイルに簡単に実装できます...
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")