อะไรคือความแตกต่างระหว่างgcc -pthread
และgcc -lpthread
ที่ใช้ในขณะรวบรวมโปรแกรมมัลติเธรด
อะไรคือความแตกต่างระหว่างgcc -pthread
และgcc -lpthread
ที่ใช้ในขณะรวบรวมโปรแกรมมัลติเธรด
คำตอบ:
-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
(แสดงเป็นคำพ้องความหมายสำหรับ-pthread
Solaris 2) และ-mthread
(สำหรับการสนับสนุนเธรดเฉพาะ MinGW บน i386 และ x86-64 Windows) ความเข้าใจของฉันคือ GCC พยายามที่จะก้าวไปสู่การใช้-pthread
อย่างสม่ำเสมอในอนาคต
-lpthread
เพียงพอที่จะรับไลบรารีเธรด POSIX ทั้งหมด
-lpthread
ไม่ได้รับห้องสมุดเกลียวทั้ง POSIX
-lpthread
ควรจะเพียงพอที่จะได้รับการสนับสนุน pthreads เต็มรูปแบบ ไม่จำเป็นต้องใช้แฟล็กการคอมไพล์อื่น ๆ
-lpthread
แต่ไม่-pthread
เพียงพอที่จะได้รับการสนับสนุน pthread ดังที่ฉันได้ชี้แจงไว้แล้วในความคิดเห็นก่อนหน้าของฉัน
-lpthread
. อย่างไรก็ตามเอกสาร gcc แสดงให้เห็นว่าสิ่งนี้อาจไม่เพียงพอที่จะได้รับการสนับสนุน pthreads ซึ่งเป็นประเด็นที่ฉันทำผ่านความคิดเห็นก่อนหน้านี้ ฉันไม่สนใจเลยว่าจะเกิดอะไรขึ้นหากคุณไม่ให้-lpthread
หรือตัวเลือกที่เป็นกรรมสิทธิ์อื่น ๆ แบบสุ่ม -lpthread
POSIX ระบุไว้เท่านั้นเพื่อรับประกัน pthreads และดูเหมือนว่าจะไม่เพียงพอสำหรับ gcc
-pthread
เพิ่มการรองรับมัลติเธรดด้วยไลบรารี pthreads ตัวเลือกนี้ตั้งค่าแฟล็กสำหรับทั้งตัวประมวลผลล่วงหน้าและตัวเชื่อมโยง ( man gcc
)
ในขณะที่
-lpthread
มีอยู่ในขณะที่การเชื่อมโยงจะไม่มีผลใด ๆ ในขณะที่ทำการประมวลผลล่วงหน้า
มีคำตอบที่ยอมรับ แต่ 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
ไม่จำเป็นหรือเพียงพอ