2017-01-26 79 views
2

Windowsでpthreadを静的にリンクするにはどうすればよいですか?私はMSYS2 MinGW 32 bitcmake v3.7を使用します。私が達成したい何cmakeで静的にリンクするpthread

が呼び出される-Wl,-Bdynamic -Wl,-Bstatic -lpthread

target_link_libraries(test PUBLIC "-Wl,-Bstatic -lpthread") 

結果を設定

g++ -static-libgcc -static-libstdc++ -std=c++11 -o test test.cpp -Wl,-Bstatic -lpthread 

などのコンパイラー呼び出しです。 CMAKE_EXE_LINKER_FLAGSを変更すると、オブジェクトファイルの前にpthreadsが含まれているため、シンボルは解決されません。

+0

説明:1)pthreadをWindows上で静的にリンクしたいと思うときは、スタティックライブラリを作成することを意味しますか?(テストは静的ライブラリですか?)またはpthread静的ライブラリにリンクしますか? – fedepad

+0

@fedepad静的pthreadにリンクされた実行可能ファイルを生成したい(g ++への更新された呼び出しが生成するため) – zeeMonkeez

答えて

0

Threadsモジュールを見つける:ドキュメントから

find_package(Threads REQUIRED) 
add_executable(myApp main.cpp) 
target_link_libraries(myApp Threads::Threads) 

注:複数のスレッドライブラリを備えたシステムの

、呼び出し側がその中にFindThreads.cmake言及したようCMAKE_THREAD_PREFER_PTHREAD

+0

そのターゲットを追加してもリンカー呼び出しが変更されないようです。 'pthread'はコマンドラインには表示されません(cmakeは' CMakeCache.txt'に従ってそれを見つけます://シンボルpthread_create CMAKE_HAVE_LIBC_CREATE:内部= 1 // pthread.hをインクルードしています CMAKE_HAVE_PTHREAD_H:INTERNAL = 1' – zeeMonkeez

+0

あなたの答えに感謝します。本当に 'target_link_libraries(ptest2 -static)'はここで必要だったものです。 – zeeMonkeez

1

を設定することができますソースコード:

# For systems with multiple thread libraries, caller can set 
# 
# :: 
# 
# CMAKE_THREAD_PREFER_PTHREAD 
# 
# If the use of the -pthread compiler and linker flag is preferred then the 
# caller can set 
# 
# :: 
# 
# THREADS_PREFER_PTHREAD_FLAG 
# 
# Please note that the compiler flag can only be used with the imported 
# target. Use of both the imported target as well as this switch is highly 
# recommended for new code. 

既に述べたことに加えて、追加フラグTHREADS_PREFER_PTHREAD_FLAGを設定する必要があります。いくつかのシステム(OSXなど)では、コンパイル時に-lpthreadをリンクするだけでは欠けているマクロが定義されているため、このフラグが必要です。

set(CMAKE_THREAD_PREFER_PTHREAD TRUE) 
set(THREADS_PREFER_PTHREAD_FLAG TRUE) 
add_library(test test.cpp) 
set_property(TARGET test PROPERTY CXX_STANDARD 11) 
set_target_properties(test PROPERTIES LINK_SEARCH_START_STATIC 1) 
set_target_properties(test PROPERTIES LINK_SEARCH_END_STATIC 1) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 
find_package(Threads REQUIRED) 

target_link_libraries(test Threads::Threads) 

役立ちますか?

+0

答えに時間を割いてくれてありがとう、 'target_link_libraries(test -static)'はこのプラットフォーム。 – zeeMonkeez

+0

nice、知っている、私は決してそれを見たことがないと思った静的なtarget_link_libraries()内部... http://stackoverflow.com/questions/16991225/cmake-and-static-linking – fedepad

+0

と言うdocs:リンクフラグ: - で始まって-lや-frameworkではない項目名は、リンカフラグとして扱われます。このようなフラグは他のliと同様に扱われます過渡的な依存関係のためには無益なリンク項目を使用するため、扶養家族に伝播しない私的なリンク項目としてのみ指定するのが一般的です。それが私の元の試みがうまくいかなかった理由です。 – zeeMonkeez

関連する問題