2013-02-02 23 views
9

静的リンクツールチェーンライブラリを使用してプログラムを構築しようとしています。 私が渡し:libwinpthreadとの静的リンク

LDFLAGS="-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -static-libgcc -static-libstdc++" 

が、共有libwinpthread-1.dllにリンクされたプログラム。

私は間違っていますか?

静的にリンクされたlibwinpthreadsを取得した場合にのみ、-staticからLDFLAGSになります。しかし、プラグインシステムを使ってプログラムをビルドすることはできません。私はからmingwの-W64 + GCC-4.7.2 MinGWのは、ビルドを使用

プロジェクト:http://sourceforge.net/projects/mingwbuilds/

+1

'-Bstatic'オプションが機能していないようですなぜ私は知らないが、あなたはおそらく、特定のライブラリファイルを指定する代わりに、'そのためld'検索をさせることにより、あなたが欲しいものを得ることができます:http ://stackoverflow.com/a/14494371/12711 –

+2

私のMinGWディストリビューションでは、静的なアーカイブは 'libpthread.a'と呼ばれています(動的なものは' libwinpthread-1.dll'もあります)。 '-lpthread'です。おそらく同じものがあなたのために有効です。 –

+0

[mingwでlibwinpthread-1.dllの静的リンクを実行する方法]の可能な複製(https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll -in-mingw) –

答えて

1

あなたは間違って何もしていないが、そのようにあなたの作品をMingwをは、ビルド。

私は最近、これにつまずいたが、別の理由:

が自動的にMingwを-ビルドGCC動的ライブラリへの実行ファイルをリンク(libwinpthread-1.dll現在、 のlibstdC++ - 6.dll、libgcc_s_dw2-1.dll)へ実行可能ファイルのサイズを保存する(問題:実行可能ファイルを解放すると、バイナリとともに不足しているDLLを追加することを忘れないようにしてください)

私の場合、問題は複数のGCC pakcagesを同じシステム上に作成したので、名前の衝突を避けるためにPATHに追加しませんでした。

楽しい部分は、プロジェクトを構成する前にCMAKEがコンパイルされ、DLLがPATHになく、CMakeによって生成された小さな実行可能ファイルがDLLがないためにクラッシュしていたため、コンパイラに関する情報を取得するためにそれがビルドプロセス全体を停止させました。

これを修正する解決策は、PATH TEMPORARILYにコンパイラパスを追加することです(または別の環境でCMakeをうまく実行すること)。 cmakeのtempディレクトリに手動でDLLを追加

は、各設定でcmakeのクリーンアップそのディレクトリので動作しません。..

あなたがmingwbuildsを使用する場合は、pthreadBLAH.dllには回避策

7

これを試してみてくださいをリンクしないように持っています:

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

お知らせ-lstdc++-lpthread。それは私のために働いた。

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

+0

私のために働いた:gcc 4.9.2 on x64 – cap

+0

なぜ-lstdC++は-lpthreadの前に-static-libstdC++? –

+0

@ kawing-chiuわかりません。それはちょうどうまくいき、私が注文を変えればそれは壊れます。 ;-) –

0

実行ファイルと同じディレクトリにランタイムDLLを配置しても構いませんが、CMakeLists.txtファイルにこれを追加できます。これにより、必要なDLLがMingWのbinディレクトリから現在のビルドディレクトリにコピーされます。

# ... 
# change to name of your project 
set(TARGET_NAME ${PROJECT_NAME}) 
# change to path to your minw bin directory 
set(MINGW_BIN_PATH "C:\\Program Files\ \(x86\)\\mingw-w64\\i686-4.9.2-posix-dwarf-rt_v3-rev1\\mingw32\\bin") 

set(LIBGCC_DLL "${MINGW_BIN_PATH}\\libgcc_s_dw2-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBGCC_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBSTDCPP_DLL "${MINGW_BIN_PATH}\\libstdc++-6.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBSTDCPP_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBWINPTHREAD_DLL "${MINGW_BIN_PATH}\\libwinpthread-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBWINPTHREAD_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
関連する問題