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