web-dev-qa-db-ja.com

mingwでlibwinpthread-1.dllの静的リンクを行う方法は?

ここから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で同じことを行うコマンドが見つかりません。

47
rsk82

GCCのコマンドラインオプションのドキュメントを確認してください。

これらは「-static-something」コマンドではなく、1つのコマンドで静的リンクに設定できるのは標準ライブラリ(libgccおよびlibstdc ++)のみです。他のライブラリの場合、最初に「-static」を使用して静的リンクに切り替え、次に「-lpthread」などの個別のコマンドで含めるライブラリをリストします。

21
Tomasz Lis

ツールチェーンに静的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の呼び出しにこれらのオプションが表示されます。

42
rubenvb

これを試して:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

-lstdc++の前の-lpthreadに注意してください。それは私のために働いた。

g++コマンドラインの最後に必ず追加してください。

26
Star Brilliant

プログラムでスレッドが使用されていない場合でもwinpthreadを静的にリンクするには、-Bstaticおよび--whole-archiveリンカーへのパラメーター:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

次のことに注意してください。

  • 「アーカイブ全体」オプションは、すぐに無効にする必要があります。
  • プログラムで実際にライブラリのシンボルを使用している場合は、このハックを行う必要はありません(つまり、<thread> C++ 11から)、この場合、静的にリンクしてもライブラリは削除されません。
  • このハックは、libwinpthread-1.dll依存関係を修正するためのMinGW-w64を対象としています。
15
user7023624

CMakeで作業している人は誰でも、このソリューションは次のようにCMakeLists.txtファイルに簡単に実装できます...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
3
Syndog