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):
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.
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.
Odpowiedzi:
@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 :
Jeśli używasz CMake 2.8.12+, możesz to uprościć, aby:
Starsze wersje CMake mogą wymagać:
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)
.źródło
NOT CMAKE_HAVE_THREADS_LIBRARY
), np. Na Ubuntu 15.04 :(/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_ARG
jest ustawiony tylko wtedy, gdy inne odmiany flaga nie stwierdzono (np.-lpthread
,-lpthread
lub-lthread
)Następujące powinny być czyste (za pomocą
find_package
) i działać (moduł wyszukiwania jest nazywanyFindThreads
):źródło
Oto odpowiednia odpowiedź:
równoważny
źródło
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.