54

ここから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

4

9 に答える 9

49

ツールチェーンに静的winpthreadが含まれている場合は、オプションを追加します

-static

可能なすべてのライブラリの静的バージョンをプルします。

または、libwinpthread.dll.aとDLL自体をツールチェーンディレクトリから削除することもできます。ただし、これにより、libstdc++およびlibgccDLLとリンクしているプログラムが混乱する可能性があるため、注意してください。

3番目のオプションは、リンクするバージョンを使用-Wl,-Bdynamic-Wl,-Bstaticて選択することです(これは-static、ldが呼び出されたときに内部的に実行されるものです)。例:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic

を追加してlinkコマンドを実行すると、and-vを使用すると、これらのオプションがld/collect2呼び出しに表示されるはずです。-static-libgcc-static-libstdc++

于 2012-12-25T20:08:59.420 に答える
33

これを試して:

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

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

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

于 2015-01-17T15:56:11.773 に答える
26

おそらく、GCCのコマンドラインオプションのドキュメントを確認する必要があります。

これらは「-static-something」コマンドではありません。1つのコマンドで静的リンクに設定できるのは標準ライブラリ(libgccおよびlibstdc ++)のみです。他のライブラリの場合は、最初に「-static」を使用した静的リンクに切り替えてから、別のコマンド、つまり「-lpthread」を使用して含めるライブラリを一覧表示します。

于 2012-12-25T14:22:17.837 に答える
22

プログラムでスレッドが使用されていない場合でも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を対象としています。
于 2017-04-13T21:52:43.640 に答える
7

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

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
于 2017-03-23T14:58:44.410 に答える
4

どうやら、CMakeは-Wlコンパイラフラグの処理方法で奇妙なことをしているため、-Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamicソリューションが機能せず、他の2つのオプション(不良コンパイラフラグ-staticと醜いコンパイラフラグ)だけが残っているよう-Wl,--whole-archiveです。

一方、CMakeで実際に機能するが、文書化されていないように見える優れたオプションは、リンカーフラグを直接使用することです。したがって、CMakeでは、これがすべてのmingw-w64C++依存関係に静的にリンクするための最良の方法のようです。

target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)

明示的にフォローしているライブラリがない場合-dynamicでも、標準の暗黙的にリンクされたライブラリが正しくリンクされるようにするために、それを適用する必要があることに注意してください。

于 2018-07-30T21:09:50.203 に答える
1

posixバリアントの代わりにmingwツールチェーンのwin32バリアントを使用することで、この問題を回避しました。win32バリアントで-static-libgcc -static-libstdc++は、独立したビルドには十分です。

于 2020-12-16T18:14:34.343 に答える
-1

とリンクするだけ-l:libwinpthread.a

于 2021-02-23T18:54:03.653 に答える
-2

に追加-staticするだけCFLAGSです。

例:./configure CFLAGS="-static"

これにより、すべての静的ライブラリが実行可能ファイルにリンクされます。

于 2014-10-22T23:57:46.917 に答える