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):
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.
Jawaban:
@Manuel adalah bagian dari sana. Anda dapat menambahkan opsi kompilator juga, seperti ini:
Jika Anda memiliki CMake 3.1.0+, ini menjadi lebih mudah :
Jika Anda menggunakan CMake 2.8.12+, Anda dapat menyederhanakan ini untuk:
Versi CMake yang lebih lama mungkin memerlukan:
Jika Anda ingin menggunakan salah satu dari dua metode pertama dengan CMake 3.1+, Anda juga perlu melakukannya
set(THREADS_PREFER_PTHREAD_FLAG ON)
.sumber
NOT CMAKE_HAVE_THREADS_LIBRARY
), misalnya di Ubuntu 15.04 :(/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_ARG
hanya diatur jika variasi lain dari bendera tidak ditemukan (yaitu.-lpthread
,-lpthread
, atau-lthread
)Yang berikut harus bersih (menggunakan
find_package
) dan bekerja (modul find dipanggilFindThreads
):sumber
Berikut ini adalah server yang benar:
setara dengan
sumber
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.