cmake dan libpthread


188

Saya sedang berlari RHEL 5.1dan menggunakan gcc.

Bagaimana saya mengatakan cmakeuntuk menambah -pthreadkompilasi dan menautkan?


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


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.