ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน
สร้างและลิงก์ไลบรารี
ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
ไลบรารีคืออะไร
ไลบรารี คือชุดไฟล์ออบเจ็กต์ที่คอมไพล์แล้ว ซึ่งคุณนำกลับมาใช้ในหลายโปรแกรมได้โดยไม่ต้องคอมไพล์ซอร์สใหม่ทุกครั้ง
C มีไลบรารีอยู่สองชนิด:
- ไลบรารีแบบสแตติก (
.a) ซึ่งคัดลอกเข้าไปในไฟล์ปฏิบัติการตอนเชื่อมโยง - ไลบรารีแบบใช้ร่วมกัน (
.so) ซึ่งโหลดขณะทำงาน
การสร้างไฟล์ออบเจ็กต์
ไลบรารีทั้งสองชนิดเริ่มต้นจากไฟล์ออบเจ็กต์ ให้คอมไพล์ซอร์สของคุณด้วย -c ตามปกติ
ไฟล์ .o เหล่านี้คือวัตถุดิบที่ตัวจัดเก็บหรือเครื่องมือเชื่อมโยงจะนำไปจัดแพ็กเกจ
gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.oการสร้างไลบรารีแบบสแตติก
ตัวจัดเก็บ ar จะรวมไฟล์ออบเจ็กต์เป็นไฟล์เก็บถาวร .a ชื่อที่ใช้ตามธรรมเนียมคือ lib<name>.a
แฟล็กมีความหมายดังนี้: r แทรกไฟล์, c สร้างหากจำเป็น, s เขียนดัชนี
ar rcs libmymath.a mathlib.o strlib.oการเชื่อมโยงไลบรารีแบบสแตติก
ใช้ -L เพื่อระบุไดเรกทอรีค้นหา และใช้ -l เพื่อระบุชื่อไลบรารี (ตัดคำนำหน้า lib และส่วนต่อท้าย .a ออก)
โค้ดที่จำเป็นจะถูกคัดลอกเข้าไปในไฟล์ปฏิบัติการ ทำให้ไฟล์นั้นทำงานได้โดยลำพัง
gcc main.c -L. -lmymath -o appข้อแลกเปลี่ยนของไลบรารีแบบสแตติก
การเชื่อมโยงแบบสแตติกเรียบง่ายและรวมทุกอย่างไว้ในตัว:
- ไฟล์ปฏิบัติการมีทุกอย่างครบ จึงไม่มีการพึ่งพาขณะทำงาน
- แต่แต่ละโปรแกรมที่มีสำเนาของตัวเองจะทำให้ไบนารีมีขนาดใหญ่ขึ้น
- การแก้ข้อผิดพลาดในไลบรารีจำเป็นต้องเชื่อมโยงโปรแกรมทุกโปรแกรมที่ใช้ไลบรารีนั้นใหม่
โค้ดที่ไม่ขึ้นกับตำแหน่ง
ไลบรารีแบบใช้ร่วมกันสามารถโหลดที่ตำแหน่งใดก็ได้ในหน่วยความจำ ดังนั้นโค้ดจึงต้องไม่ขึ้นกับตำแหน่ง ให้คอมไพล์ด้วย -fPIC
วิธีนี้จะสร้างโค้ดที่ใช้การระบุที่อยู่แบบสัมพัทธ์แทนที่อยู่ตายตัว
gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.oการสร้างไลบรารีแบบใช้ร่วมกัน
สร้างไฟล์ .so ด้วย -shared ชื่อที่ใช้ตามธรรมเนียมคือ lib<name>.so
ต่างจากไฟล์เก็บถาวรแบบสแตติก ไฟล์นี้เป็นออบเจ็กต์ที่เชื่อมโยงจริง ซึ่งตัวโหลดสามารถแมปได้ขณะทำงาน
gcc -shared mathlib.o strlib.o -o libmymath.soการเชื่อมโยงไลบรารีแบบใช้ร่วมกัน
การเชื่อมโยงดูเหมือนกับกรณีแบบสแตติกทุกประการ ความแตกต่างคือโค้ดจะไม่ถูกคัดลอกเข้าไป แต่จะบันทึกไว้เพียงการอ้างอิง
ไฟล์ปฏิบัติการมีขนาดเล็กลง แต่จะพึ่งพาการค้นหา libmymath.so ขณะทำงาน
gcc main.c -L. -lmymath -o appการค้นหาไลบรารีขณะทำงาน
เมื่อเริ่มต้นทำงาน ตัวโหลดแบบไดนามิกจะค้นหาไฟล์ .so ในเส้นทางมาตรฐาน ไฟล์ไลบรารีในไดเรกทอรีปัจจุบันจะไม่อยู่ในรายการนั้น
ในการทดสอบ ให้ระบุเส้นทางแก่ตัวโหลดด้วย LD_LIBRARY_PATH (Linux)
LD_LIBRARY_PATH=. ./appข้อแลกเปลี่ยนของไลบรารีแบบใช้ร่วมกัน
ไลบรารีแบบใช้ร่วมกันแลกความเรียบง่ายกับความยืดหยุ่น:
- หลายโปรแกรมใช้สำเนาเดียวกันในหน่วยความจำ จึงประหยัด RAM และพื้นที่ดิสก์
- การแก้ข้อผิดพลาดใน
.soจะเป็นประโยชน์ต่อทุกโปรแกรมโดยไม่ต้องเชื่อมโยงใหม่ - แต่โปรแกรมจะเริ่มทำงานไม่ได้หากไม่มี
.soหรือไฟล์นั้นเข้ากันไม่ได้
ความเสี่ยงประการสุดท้ายนี้เรียกกันทั่วไปว่า 'นรกของการพึ่งพา'
การตรวจสอบการพึ่งพา
มีเครื่องมือสองชนิดที่ช่วยให้คุณเห็นว่าไบนารีเชื่อมโยงกับอะไร:
ldd appแสดงไลบรารีแบบใช้ร่วมกันที่ตัวโหลดต้องใช้ขณะทำงานnm libmymath.aแสดงสัญลักษณ์ (ฟังก์ชัน) ภายในไลบรารี
หาก ldd แสดง 'not found' ตัวโหลดจะไม่สามารถค้นหา .so ในเส้นทางค้นหาได้
ldd app
nm libmymath.aตรวจสอบความเข้าใจอย่างรวดเร็ว
จับคู่แฟล็กกับเป้าหมายให้ถูกต้อง
ทบทวน
ตอนนี้คุณสามารถสร้างและเชื่อมโยงไลบรารีทั้งสองชนิดได้แล้ว:
- แบบสแตติก:
ar rcs libX.a *.oโค้ดถูกคัดลอกเข้าไปในไบนารี รวมทุกอย่างไว้ในตัวแต่มีขนาดใหญ่กว่า - แบบใช้ร่วมกัน: คอมไพล์ด้วย
-fPICสร้างด้วย-sharedและโหลดโค้ดขณะทำงาน - เชื่อมโยงทั้งสองชนิดด้วย
-Lและ-lโดยไลบรารีแบบใช้ร่วมกันต้องมีเส้นทางค้นหาขณะทำงาน เช่นLD_LIBRARY_PATH
ตอนนี้คุณมีชุดเครื่องมือครบตั้งแต่ตัวประมวลผลล่วงหน้าจนถึงการสร้างแล้ว
คำถามที่พบบ่อย
บทเรียน “ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน”
สร้างและลิงก์ไลบรารี คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคอมไพล์แบบมีเงื่อนไข
- โปรเจกต์หลายไฟล์
- Makefile
- ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน