Risposte:
@Manuel era in parte lì. Puoi anche aggiungere l'opzione del compilatore, in questo modo:
Se hai CMake 3.1.0+, questo diventa ancora più semplice :
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)
Se si utilizza CMake 2.8.12+, è possibile semplificare questo per:
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()
Le versioni precedenti di CMake potrebbero richiedere:
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()
Se si desidera utilizzare uno dei primi due metodi con CMake 3.1+, è necessario set(THREADS_PREFER_PTHREAD_FLAG ON)
anche lì.
NOT CMAKE_HAVE_THREADS_LIBRARY
), ad esempio su Ubuntu 15.04 :(
/usr/share/cmake-2.8/Modules/FindThreads.cmake
(ad es. Vedi qui apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) fondamentalmente, THREADS_HAVE_PTHREAD_ARG
viene impostato solo se le altre varianti della bandiera non sono stati trovati (es. -lpthread
, -lpthread
, o -lthread
)
Quanto segue dovrebbe essere pulito (usando find_package
) e funzionare (si chiama il modulo find FindThreads
):
cmake_minimum_required (VERSION 2.6)
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Ecco la risposta giusta:
ADD_EXECUTABLE(your_executable ${source_files})
TARGET_LINK_LIBRARIES( your_executable
pthread
)
equivalente a
-lpthread
target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")
che è almeno basato su target e non fallisce su Windows e altre piattaforme.