cmake và libpthread


187

Tôi đang chạy RHEL 5.1và sử dụng gcc.

Làm thế nào tôi nói cmakeđể thêm -pthreadvào biên dịch và liên kết?


1
Bạn có thể chọn một câu trả lời cho điều này?
Jared Burrows

1
Anh bạn, bạn phải chọn @ Manuel's làm câu trả lời.

Câu trả lời của @Ehsan là cách tốt hơn! :-)
Ela782

Câu trả lời:


205

@Manuel là một phần ở đó. Bạn cũng có thể thêm tùy chọn trình biên dịch, như thế này:

Nếu bạn có CMake 3.1.0+, điều này càng trở nên dễ dàng hơn :

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

Nếu bạn đang sử dụng CMake 2.8.12+, bạn có thể đơn giản hóa việc này thành:

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

Các phiên bản CMake cũ hơn có thể yêu cầu:

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

Nếu bạn muốn sử dụng một trong hai phương pháp đầu tiên với CMake 3.1+, bạn cũng sẽ cần set(THREADS_PREFER_PTHREAD_FLAG ON)đến đó.


Có vẻ như ví dụ CMake 3.0.2 sẽ không đặt THREADS_HAVE_PTHREAD_ARG nếu thư viện pthread được tìm thấy ( NOT CMAKE_HAVE_THREADS_LIBRARY), ví dụ: trên Ubuntu 15.04 :(
mlt

1
Phiên bản được cung cấp cho CMake 2.8.12+ sẽ không hoạt động như dự định, vì cách mã hoạt động /usr/share/cmake-2.8/Modules/FindThreads.cmake(ví dụ: xem tại đây apt-browse.org/browse/ubfox/trusty/main/all/cmake-data/ tựa ) về cơ bản, THREADS_HAVE_PTHREAD_ARGchỉ được thiết lập nếu các biến thể khác của lá cờ không được tìm thấy (ví dụ. -lpthread, -lpthreadhoặc -lthread)
j1elo

Điều này đưa ra lỗi "Không thể chỉ định các thư viện liên kết cho mục tiêu" my_app "không được xây dựng bởi dự án này." - làm thế nào để bạn kích hoạt nó trên toàn cầu mà không phải thực hiện riêng lẻ cho từng mục tiêu?
Chris Dodd

Đây có phải là cách dễ nhất trong năm 2020 / cmake 3.17 không?
Jay

Điều gì xảy ra nếu bạn không đặt cờ THREADS_PREFER_PTHREAD_FLAG, chỉ cần tìm và liên kết?
Jay

199

Sau đây phải sạch (sử dụng find_package) và làm việc (mô-đun tìm được gọi FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
Điều này không hoạt động khi sử dụng trong một dự án chỉ CXX. Có ai biết một cách giải quyết tốt đẹp?
Simon

1
@Simon hơi muộn nhưng xin vui lòng xem điều này: stackoverflow.com/questions/15193785/ory
congusbongus

@CongXu Cảm ơn! Tốt để biết!
Simon

1
Giải pháp này hoạt động tốt với Mac OS X, Centos 6 và Solaris 10.
bernardn

1
Lưu ý rằng điều này sẽ không được đặt cờ trình biên dịch
-pthread

25

Đây là anwser đúng:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

tương đương với

-lpthread

Điều này là tương đương. "-Pthread" quyên góp nhiều hơn nữa - khi biên dịch, nó -D_REENTRANT, tại thời gian liên kết -lpthread. Trên một số hệ thống thậm chí có thể nhiều hơn thế.
dimba

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM

21
giải pháp này gạch ngay khi bạn thay đổi từ linux sang freebsd hoặc windows.
Alex

4
Không hoạt động, "target_link_l library (your_executable pthread)" là cách nó nên được viết.
Vượt qua

6
Đây không phải là câu trả lời đúng bằng mọi cách. Ngay cả khi bạn không thích câu trả lời của nhà cái và xem xét nó được viết vào năm 2009, thì nó hoàn toàn không phải là nền tảng chéo. Sử dụng câu trả lời của nhà cái - và nếu bạn không thích nó thì hãy tìm một cái gì đó giống như target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")ít nhất là dựa trên mục tiêu và không thất bại trên Windows và các nền tảng khác.
Ela782
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.