cmake และ libpthread


188

ฉันกำลังใช้RHEL 5.1งานอยู่gccอยู่

ฉันcmakeจะบอกให้เพิ่ม-pthreadในการรวบรวมและการเชื่อมโยงได้อย่างไร


1
คุณสามารถเลือกคำตอบสำหรับสิ่งนี้ได้ไหม?
Jared Burrows

1
เพื่อนคุณต้องเลือก @ Manuel's เป็นคำตอบ

@Ehsan thehouse คำตอบดีกว่า! :-)
Ela782

คำตอบ:


208

@Manuel เป็นส่วนหนึ่งที่นั่น คุณสามารถเพิ่มตัวเลือกคอมไพเลอร์ได้เช่นกัน:

หากคุณมี CMake 3.1.0+ สิ่งนี้จะกลายเป็นเรื่องง่ายยิ่งขึ้น :

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

หากคุณใช้ CMake 2.8.12+ คุณสามารถทำให้สิ่งนี้ง่ายขึ้นเพื่อ:

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

รุ่น CMake ที่เก่ากว่าอาจต้องการ:

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

หากคุณต้องการใช้หนึ่งในสองวิธีแรกกับ CMake 3.1+ คุณจะต้องset(THREADS_PREFER_PTHREAD_FLAG ON)มีเช่นกัน


ดูเหมือนว่าเช่น CMake 3.0.2 จะไม่ตั้ง THREADS_HAVE_PTHREAD_ARG หากพบไลบรารี pthread ( NOT CMAKE_HAVE_THREADS_LIBRARY) เช่นบน Ubuntu 15.04 :(
mlt

1
เวอร์ชันที่ให้สำหรับ CMake 2.8.12+ จะไม่ทำงานตามที่ควรจะเป็นเพราะวิธีการทำงานของรหัส/usr/share/cmake-2.8/Modules/FindThreads.cmake(เช่นดูที่นี่apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/ … ) โดยทั่วไปTHREADS_HAVE_PTHREAD_ARGมีการตั้งค่าเฉพาะในกรณีที่รูปแบบอื่น ๆ ของธงไม่พบ (ie. -lpthread, -lpthreadหรือ-lthread)
j1elo

สิ่งนี้ทำให้เกิดข้อผิดพลาด "ไม่สามารถระบุไลบรารีลิงก์สำหรับเป้าหมาย" my_app "ซึ่งไม่ได้สร้างโดยโครงการนี้" - คุณจะทำให้มันเป็นสากลได้อย่างไรโดยไม่ต้องทำทีละตัวสำหรับแต่ละเป้าหมาย?
Chris Dodd

วิธีแรกยังคงเป็นวิธีที่ง่ายที่สุดในปี 2020 / cmake 3.17 หรือไม่?
Jay

จะเกิดอะไรขึ้นหากคุณไม่ได้ตั้งค่าสถานะ THREADS_PREFER_PTHREAD_FLAG เพียงค้นหาและเชื่อมโยง
Jay

199

ต่อไปนี้ควรสะอาด (ใช้find_package) และทำงาน (เรียกว่าโมดูลค้นหาFindThreads):

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

2
สิ่งนี้ไม่ทำงานเมื่อใช้ในโครงการ CXX เท่านั้น ไม่มีใครรู้วิธีแก้ปัญหาที่ดี?
467 Simon

1
@Simon บิตช้า แต่โปรดดูที่: stackoverflow.com/questions/15193785//
congusbongus

@CongXu ขอบคุณ! ดีแล้วที่รู้!
Simon

1
โซลูชันนี้ใช้งานได้กับ Mac OS X, Centos 6 และ Solaris 10
bernardn

1
โปรดทราบว่านี่จะไม่ตั้งค่าแฟล็กคอมไพเลอร์ -pthread
mlt

26

นี่คือ anwser ที่ถูกต้อง:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

เทียบเท่ากับ

-lpthread

สิ่งนี้เทียบเท่า "-pthread" บริจาคมากขึ้น - เมื่อรวมเป็น -D_REENTRANT เวลาลิงก์ - lpthread ในบางระบบที่แม้จะมากไปกว่านี้
dimba

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

21
โซลูชันนี้จะเปลี่ยนทันทีที่คุณเปลี่ยนจาก linux เป็น freebsd หรือ windows
Alex

4
ไม่ทำงาน "target_link_l ไลบรารี (your_executable pthread)" เป็นวิธีการเขียน
โอเวอร์

6
นี่ไม่ใช่คำตอบที่ถูกต้องไม่ว่าด้วยวิธีใด แม้ว่าคุณจะไม่ชอบคำตอบของเฮาส์และการพิจารณาสิ่งนี้ถูกเขียนในปี 2009 มันเป็นแพลตฟอร์มที่ไม่ข้าม ใช้คำตอบของเฮาส์แอ็ด - และถ้าคุณไม่ชอบก็ลองทำtarget_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")ตามที่เป้าหมายอย่างน้อยที่สุดและไม่ล้มเหลวบน Windows และแพลตฟอร์มอื่น ๆ
Ela782
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.