ความแตกต่างระหว่าง -pthread และ -lpthread ขณะคอมไพล์


คำตอบ:


116

-pthread บอกให้คอมไพเลอร์เชื่อมโยงในไลบรารี pthread รวมทั้งกำหนดค่าการคอมไพล์สำหรับเธรด

ตัวอย่างเช่นต่อไปนี้แสดงมาโครที่ได้รับการกำหนดเมื่อมีการใช้-pthreadตัวเลือกในแพ็คเกจ GCC ที่ติดตั้งบนเครื่อง Ubuntu ของฉัน:

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

การใช้-lpthreadตัวเลือกจะทำให้ไลบรารี pthread เชื่อมโยงเท่านั้น - มาโครที่กำหนดไว้ล่วงหน้าไม่ได้รับการกำหนด

บรรทัดล่าง: คุณควรใช้-pthreadตัวเลือก


หมายเหตุ: -pthreadตัวเลือกนี้ได้รับการบันทึกเป็นตัวเลือกเฉพาะแพลตฟอร์มในเอกสาร GCC ดังนั้นจึงอาจไม่พร้อมใช้งานเสมอไป อย่างไรก็ตามมีให้ใช้งานบนแพลตฟอร์มที่เอกสาร GCC ไม่ได้ระบุไว้อย่างชัดเจน (เช่น i386 และ x86-64) คุณควรใช้เมื่อมี

นอกจากนี้โปรดทราบว่า GCC ใช้ตัวเลือกอื่นที่คล้ายคลึงกันเช่น-pthreads(แสดงเป็นคำพ้องความหมายสำหรับ-pthreadSolaris 2) และ-mthread(สำหรับการสนับสนุนเธรดเฉพาะ MinGW บน i386 และ x86-64 Windows) ความเข้าใจของฉันคือ GCC พยายามที่จะก้าวไปสู่การใช้-pthreadอย่างสม่ำเสมอในอนาคต


2
ซึ่งแปลกเพราะมันขัดแย้งกับ POSIX โดยตรง POSIX กำหนดว่าการส่งผ่าน-lpthreadเพียงพอที่จะรับไลบรารีเธรด POSIX ทั้งหมด
fuz

@FUZxxl ผ่าน-lpthread ไม่ได้รับห้องสมุดเกลียวทั้ง POSIX
user253751

5
@immibis ไม่ฉันหมายถึง POSIX บอกว่าการเชื่อมโยงกับ-lpthreadควรจะเพียงพอที่จะได้รับการสนับสนุน pthreads เต็มรูปแบบ ไม่จำเป็นต้องใช้แฟล็กการคอมไพล์อื่น ๆ
fuz

1
@alecov สิ่งที่ผิดปกติกับ gcc คือการรวบรวม-lpthreadแต่ไม่-pthreadเพียงพอที่จะได้รับการสนับสนุน pthread ดังที่ฉันได้ชี้แจงไว้แล้วในความคิดเห็นก่อนหน้าของฉัน
fuz

2
@alecov POSIX กำหนดให้ pthreads ต้องทำงานหากคุณกำหนดค่าสภาพแวดล้อม POSIX และเชื่อมโยงกับ-lpthread. อย่างไรก็ตามเอกสาร gcc แสดงให้เห็นว่าสิ่งนี้อาจไม่เพียงพอที่จะได้รับการสนับสนุน pthreads ซึ่งเป็นประเด็นที่ฉันทำผ่านความคิดเห็นก่อนหน้านี้ ฉันไม่สนใจเลยว่าจะเกิดอะไรขึ้นหากคุณไม่ให้-lpthreadหรือตัวเลือกที่เป็นกรรมสิทธิ์อื่น ๆ แบบสุ่ม -lpthreadPOSIX ระบุไว้เท่านั้นเพื่อรับประกัน pthreads และดูเหมือนว่าจะไม่เพียงพอสำหรับ gcc
fuz

11

-pthreadเพิ่มการรองรับมัลติเธรดด้วยไลบรารี pthreads ตัวเลือกนี้ตั้งค่าแฟล็กสำหรับทั้งตัวประมวลผลล่วงหน้าและตัวเชื่อมโยง ( man gcc)

ในขณะที่

-lpthread มีอยู่ในขณะที่การเชื่อมโยงจะไม่มีผลใด ๆ ในขณะที่ทำการประมวลผลล่วงหน้า


4

มีคำตอบที่ยอมรับ แต่ IMO ไม่ได้ให้บริบทและข้อมูลเชิงลึกเพียงพอ ดังนั้นคำตอบพิเศษนี้


-lpthread เป็นวิธีแก้ปัญหาที่ไม่มีอยู่แล้ว (ตั้งแต่ ~ 2005)

ในสมัยก่อนมีการใช้งานที่เป็นกรรมสิทธิ์ของPthreads APIที่ไม่ POSIX สอดคล้องเช่นLinuxThreads มาตรฐาน POSIX บอกเพียงว่าหากต้องการพฤติกรรมที่สอดคล้องกับ POSIX ก็ต้องเชื่อมโยง-lpthreadและการเชื่อมโยงที่จำเป็นเพื่อเชื่อมโยงการใช้งาน Pthreads API ที่สอดคล้องกับ POSIX หากมีการใช้งานหลายอย่าง

ไม่มีการใช้งาน Pthreads API หลายครั้งในระบบปฏิบัติการสมัยใหม่ และนั่นคือเหตุผลที่-lpthreadไม่ทำหน้าที่ใด ๆ อีกต่อไป


คอมไพเลอร์เช่นgccและclang(และอาจเป็นคอมไพเลอร์ที่เข้ากันได้กับ Linux ทั้งหมด) ต้องการการใช้-pthreadตัวเลือกบรรทัดคำสั่งสำหรับทั้งการคอมไพล์และการเชื่อมโยงแอพพลิเคชั่นแบบมัลติเธรดที่รองรับ POSIX และนั่นคือสิ่งที่ต้องใช้

ที่รวบรวมเวลา-pthreadปรากฏตัวเลือกที่ pthread API มีการร้องขอ (อาจมี APIs เกลียวหลายเช่น Solaris กระทู้) แมโครและกำหนดเฉพาะแพลตฟอร์ม ( _REENTRANTบน Linux , _MTบน Solaris)

ในเวลา-pthreadลิงก์ลิงก์ในไลบรารีที่จำเป็น (ถ้ามี) ที่ใช้ลักษณะการทำงานของ Pthreads API ที่สอดคล้องกับ POSIX

ข้างต้นทำให้ชัดเจนว่าเหตุใดจึง-lpthreadไม่จำเป็นหรือเพียงพอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.