Sono in esecuzione RHEL 5.1
e uso gcc
.cmake e libpthread
Come dico a cmake
per aggiungere -pthread
alla compilazione e al collegamento?
Sono in esecuzione RHEL 5.1
e uso gcc
.cmake e libpthread
Come dico a cmake
per aggiungere -pthread
alla compilazione e al collegamento?
Ecco l'anwser destra:
ADD_EXECUTABLE(your_executable ${source_files})
TARGET_LINK_LIBRARIES(your_executable
pthread
)
equivalente a
-lpthread
Questo è equivalente. "-pthread" dona molto di più - alla compilazione è -D_REENTRANT, al link time -lpthread. Su alcuni sistemi persino può essere più di questo. – dimba
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread") –
Mi sento come se questa risposta rispondesse direttamente alla domanda. Concordo sul fatto che l'utilizzo del modulo Trova discussioni sia più portabile, ma non è quello che è stato chiesto. – JonnyRo
Il seguente dovrebbe essere pulita (utilizzando find_package
) e il lavoro (il modulo di ritrovamento si chiama FindThreads
):
cmake_minimum_required (VERSION 2.6)
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Questo non funziona quando si utilizza in un progetto CXX solo. Qualcuno sa una soluzione piacevole? – Simon
@Simon un po 'in ritardo, ma per favore vedi questo: http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu – congusbongus
@CongXu Grazie! Buono a sapersi! – Simon
@Manuel era in parte lì. È possibile aggiungere l'opzione del compilatore, così, in questo modo:
Se avete CMake 3.1.0+, this becomes even easier:
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app Threads::Threads)
Se si utilizza CMake 2.8.12+, è possibile semplificare questo a:
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()
versioni più vecchio CMake possono 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 i primi due metodi con CMake 3.1+, avrete bisogno anche di set(THREADS_PREFER_PTHREAD_FLAG ON)
.
Sembra ad es. CMake 3.0.2 non imposterà THREADS_HAVE_PTHREAD_ARG se è stata trovata la libreria pthread ('NOT CMAKE_HAVE_THREADS_LIBRARY'), ad es. su Ubuntu 15.04 :( – mlt
Questa dovrebbe essere la risposta accettata – csl
La versione fornita per CMake 2.8.12+ non funzionerà come previsto, a causa di come funziona il codice in /usr/share/cmake-2.8/Modules/FindThreads .cmake' (ad esempio, vedere qui https://www.apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/2.8.12.2-0ubuntu3/file/usr/share/cmake-2.8/Modules/FindThreads.cmake) Fondamentalmente, 'THREADS_HAVE_PTHREAD_ARG' viene impostato solo se non sono state trovate le altre varianti della bandiera (es.' -lpthread', ' -lpthread', o '-lthread') – j1elo
Puoi scegliere una risposta per questo? –
Amico, devi scegliere @ Manuel come risposta. –
@Ehsan thehouse's answer is way better! :-) – Ela782