0Pricing
C Academy · บทเรียน

ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน

สร้างและลิงก์ไลบรารี

ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคอมไพล์แบบมีเงื่อนไข
  2. โปรเจกต์หลายไฟล์
  3. Makefile
  4. ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน
← กลับไปที่ C Academy