cmake dan libpthread

188

Saya sedang berlari RHEL 5.1dan menggunakan gcc.

Bagaimana saya mengatakan cmakeuntuk menambah -pthreadkompilasi dan menautkan?

dimba
sumber
1
Bisakah Anda memilih jawaban untuk ini?
Jared Burrows
1
Bung, Anda harus memilih @ Manuel sebagai jawabannya.
Jawaban @Ehsan thehouse jauh lebih baik! :-)
Ela782

Jawaban:

208

@Manuel adalah bagian dari sana. Anda dapat menambahkan opsi kompilator juga, seperti ini:

Jika Anda memiliki CMake 3.1.0+, ini menjadi lebih mudah :

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

Jika Anda menggunakan CMake 2.8.12+, Anda dapat menyederhanakan ini untuk:

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

Versi CMake yang lebih lama mungkin memerlukan:

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

Jika Anda ingin menggunakan salah satu dari dua metode pertama dengan CMake 3.1+, Anda juga perlu melakukannya set(THREADS_PREFER_PTHREAD_FLAG ON).

rumah
sumber
Sepertinya misalnya CMake 3.0.2 tidak akan mengatur THREADS_HAVE_PTHREAD_ARG jika pthread library ditemukan ( NOT CMAKE_HAVE_THREADS_LIBRARY), misalnya di Ubuntu 15.04 :(
mlt
1
Versi yang diberikan untuk CMake 2.8.12+ tidak akan berfungsi sebagaimana dimaksud, karena cara kerjanya kode /usr/share/cmake-2.8/Modules/FindThreads.cmake(mis. Lihat di sini apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) pada dasarnya, THREADS_HAVE_PTHREAD_ARGhanya diatur jika variasi lain dari bendera tidak ditemukan (yaitu. -lpthread, -lpthread, atau -lthread)
j1elo
Ini memberikan kesalahan "Tidak dapat menentukan pustaka tautan untuk target" my_app "yang tidak dibuat oleh proyek ini." - bagaimana Anda mengaktifkannya secara universal tanpa harus melakukannya secara individual untuk setiap target?
Chris Dodd
Apakah cara pertama masih paling mudah di tahun 2020 / cmake 3.17?
Jay
Apa yang terjadi jika Anda tidak menetapkan flag THREADS_PREFER_PTHREAD_FLAG, cari dan tautkan saja?
Jay
199

Yang berikut harus bersih (menggunakan find_package) dan bekerja (modul find dipanggil FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Manuel
sumber
2
Ini tidak berfungsi saat menggunakan dalam proyek CXX saja. Adakah yang tahu solusi yang bagus?
Simon
1
@Simon agak terlambat tapi tolong lihat ini: stackoverflow.com/questions/15193785/…
congusbongus
@CongXu Terima kasih! Senang mendengarnya!
Simon
1
Solusi ini berfungsi dengan baik pada Mac OS X, Centos 6 dan Solaris 10.
bernardn
1
Perhatikan bahwa ini tidak akan menetapkan flag compiler -pthread
mlt
26

Berikut ini adalah server yang benar:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

setara dengan

-lpthread
Nadir SOUALEM
sumber
Ini setara. "-pthread" menyumbang lebih banyak - pada kompilasi -D_REENTRANT, pada waktu tautan -lpthread. Pada beberapa sistem bahkan bisa lebih dari ini.
dimba
2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM
21
batu bata solusi ini segera setelah Anda mengubah dari linux ke freebsd atau windows.
Alex
4
Tidak berfungsi, "target_link_libraries (pthread your_executable)" adalah bagaimana seharusnya ditulis.
Overv
6
Ini bukan jawaban yang tepat dengan cara apa pun. Bahkan jika Anda tidak menyukai jawaban thehouse, dan mengingat ini ditulis pada tahun 2009, itu sepenuhnya non-cross platform. Gunakan jawaban thehouse - dan jika Anda tidak menyukainya maka pilihlah sesuatu target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")yang setidaknya berbasis target dan tidak gagal pada Windows dan platform lainnya.
Ela782