cmake i libpthread


188

Uruchomię RHEL 5.1i używam gcc.

Jak mogę cmakedodać -pthreaddo kompilacji i linkowania?


1
Czy możesz wybrać odpowiedź na to pytanie?
Jared Burrows,

1
Koleś, musisz wybrać @ Manuela jako odpowiedź.

Odpowiedź @Ehsan thehouse jest znacznie lepsza! :-)
Ela782,

Odpowiedzi:


208

@Manuel był w połowie drogi. Możesz również dodać opcję kompilatora, na przykład:

Jeśli masz CMake 3.1.0+, staje się to jeszcze łatwiejsze :

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

Jeśli używasz CMake 2.8.12+, możesz to uprościć, aby:

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()

Starsze wersje CMake mogą wymagać:

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()

Jeśli chcesz skorzystać z jednej z dwóch pierwszych metod w CMake 3.1+, też będziesz jej potrzebować set(THREADS_PREFER_PTHREAD_FLAG ON).


Wygląda na to, że np. CMake 3.0.2 nie ustawi THREADS_HAVE_PTHREAD_ARG, jeśli zostanie znaleziona biblioteka pthread ( NOT CMAKE_HAVE_THREADS_LIBRARY), np. Na Ubuntu 15.04 :(
mlt

1
Wersja podana dla CMake 2.8.12+ nie będzie działać zgodnie z przeznaczeniem, ponieważ działa w kodzie /usr/share/cmake-2.8/Modules/FindThreads.cmake(np. Patrz tutaj apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) zasadniczo, THREADS_HAVE_PTHREAD_ARGjest ustawiony tylko wtedy, gdy inne odmiany flaga nie stwierdzono (np. -lpthread, -lpthreadlub -lthread)
j1elo

Daje to błąd „Nie można określić bibliotek linków dla docelowego„ my_app ”, który nie został zbudowany przez ten projekt.” - jak włączyć to uniwersalnie, bez konieczności robienia tego indywidualnie dla każdego celu?
Chris Dodd

Czy pierwszy jest wciąż najłatwiejszym sposobem w 2020 / cmake 3.17?
Jay

Co się stanie, jeśli nie ustawisz flagi THREADS_PREFER_PTHREAD_FLAG, po prostu znajdź i połącz?
Jay

199

Następujące powinny być czyste (za pomocą find_package) i działać (moduł wyszukiwania jest nazywany FindThreads):

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

2
Nie działa to w przypadku użycia tylko w projekcie CXX. Czy ktoś zna dobre obejście?
Simon

1
@ Simon jest trochę spóźniony, ale proszę zobaczyć to: stackoverflow.com/questions/15193785/...
congusbongus

@CongXu Thanks! Dobrze wiedzieć!
Simon

1
To rozwiązanie działa w systemach Mac OS X, Centos 6 i Solaris 10.
Bernardn,

1
Zauważ, że to nie ustawi flagi -pthread kompilatora
mlt

26

Oto odpowiednia odpowiedź:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

równoważny

-lpthread

To jest równoważne. „-pthread” przekazuje znacznie więcej - przy kompilacji jest to -D_REENTRANT, w czasie łącza -lpthread. W niektórych systemach nawet może być więcej niż to.
dimba

2
ZESTAW (CMAKE_CXX_FLAGS_DEBUG „... -lpthread”) ZESTAW (CMAKE_CXX_FLAGS_RELEASE „... -lpthread”)
Nadir SOUALEM

21
to rozwiązanie działa od razu po zmianie z Linuksa na Freebsd lub Windows.
Alex

4
Nie działa, „target_link_libraries (twoja_wykonywalna pthread)” to sposób, w jaki powinien być napisany.
Overv

6
W żadnym wypadku nie jest to właściwa odpowiedź. Nawet jeśli nie podoba ci się odpowiedź domu, a biorąc pod uwagę, że została napisana w 2009 roku, jest to całkowicie nieprzekraczająca platformy. Skorzystaj z odpowiedzi domu - a jeśli ci się nie podoba, wybierz coś, target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")co jest co najmniej oparte na celach i nie zawiedzie na Windowsie i innych platformach.
Ela782,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.