cmake ve libpthread


188

Koşuyorum RHEL 5.1ve kullanıyorum gcc.

Derlemeye ve bağlantıya cmakeeklemeyi nasıl söyleyebilirim -pthread?


1
Bunun için bir cevap seçebilir misin?
Jared Burrows

1
Dostum, cevap olarak @ Manuel's'i seçmelisin.

@Ehsan Thehouse'un cevabı çok daha iyi! :-)
Ela782

Yanıtlar:


208

@Manuel kısmen oradaydı. Derleyici seçeneğini de şu şekilde ekleyebilirsiniz:

CMake 3.1.0+ sürümüne sahipseniz, bu daha da kolaylaşır :

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

CMake 2.8.12+ sürümünü kullanıyorsanız, aşağıdakileri basitleştirebilirsiniz:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  target_compile_options(my_app PUBLIC "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

Eski CMake sürümleri aşağıdakileri gerektirebilir:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

CMake 3.1+ ile ilk iki yöntemden birini kullanmak istiyorsanız, set(THREADS_PREFER_PTHREAD_FLAG ON)oraya da ihtiyacınız olacak .


Bu 3.0.2 set THREADS_HAVE_PTHREAD_ARG pthread kitaplığı (saptandı etmezse örn CMake gibi görünüyor NOT CMAKE_HAVE_THREADS_LIBRARYmesela Ubuntu 15.04 :( üzerine,)
mlt

1
CMake 2.8.12+ için verilen sürüm, kodun nasıl çalıştığı nedeniyle amaçlandığı gibi çalışmaz /usr/share/cmake-2.8/Modules/FindThreads.cmake(bkz. Apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) Temel olarak, THREADS_HAVE_PTHREAD_ARG(. yani bayrağın diğer varyasyonları bulunmamıştır yalnızca ayarlanır -lpthread, -lpthreadya -lthread)
j1elo

Bu, "Bu proje tarafından oluşturulmayan" my_app "hedefi için bağlantı kitaplıkları belirtilemiyor" hatasını verir. - her hedef için ayrı ayrı yapmak zorunda kalmadan evrensel olarak nasıl etkinleştirirsiniz?
Chris Dodd

2020 / cmake 3.17'de ilk hala en kolay yol mu?
Jay

THREADS_PREFER_PTHREAD_FLAG bayrağını ayarlamazsanız, bulup bağlarsanız ne olur?
Jay

199

Aşağıdakiler temiz (kullanarak find_package) ve çalışmalıdır (find modülü çağrılır FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
Bu yalnızca bir CXX projesinde kullanıldığında çalışmaz. Güzel bir çözüm bilen var mı?
Simon

1
@Simon biraz geç ama lütfen şuna bakın: stackoverflow.com/questions/15193785/…
congusbongus

@CongXu Teşekkürler! Bunu bildiğim iyi oldu!
Simon

1
Bu çözüm Mac OS X, Centos 6 ve Solaris 10 ile çalışır
bernardn


26

İşte doğru cevap:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

eşittir

-lpthread

Bu eşdeğerdir. "-pthread" çok daha fazla bağış yapar - derleme sırasında -D_REENTRANT, -lpthread bağlantı zamanında. Bazı sistemlerde bile bundan daha fazlası olabilir.
dimba

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM

21
linux'dan freebsd veya pencerelere geçer geçmez bu çözüm tuğlaları.
Alex

4
Çalışmıyor, "target_link_libraries (sizin ifade edilebilir pthread)" nasıl yazılması gerektiğidir.
Ocak'ta Overv

6
Bu hiçbir şekilde doğru cevap değil. Evin cevabını beğenmeseniz ve bunun 2009'da yazıldığını düşünseniz bile, tamamen çapraz olmayan bir platformdur. Evin cevabını kullanın - eğer beğenmediyseniz target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>"), en azından hedef tabanlı ve Windows ve diğer platformlarda başarısız olmayan bir şey için gidin .
Ela782
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.