ไลบรารี่ในภาษา C นั้นเป็นแบบนั้น ไลบรารี่ ฉันรู้ว่ามันฟังดูคลุมเครือ แต่ไม่มีวิธีใดที่จะอธิบายได้ดีไปกว่านี้ อย่างน้อยก็อย่างผิวเผิน ห้องสมุดในโลกแห่งความเป็นจริงคือชุดของวัตถุที่มีข้อมูล อ็อบเจ็กต์ในไลบรารีกายภาพคือหนังสือ ในขณะที่อ็อบเจ็กต์ในไลบรารี C คือไฟล์อ็อบเจ็กต์ของโปรแกรมที่คอมไพล์เป็นไฟล์ที่โดยทั่วไปจะลงท้ายด้วยคำต่อท้าย ".a" โดยใช้โปรแกรม ar ไฟล์เหล่านี้สามารถใช้เป็นเอนทิตีเดียวในเฟสการเชื่อมโยงของโปรแกรม วัตถุประสงค์ในขั้นต้นของไลบรารีแบบคงที่คือการประหยัดเวลาในการคอมไพล์โดยการเชื่อมโยงโปรแกรมที่คอมไพล์ไว้ล่วงหน้าเข้าด้วยกันแทนที่จะคอมไพล์ตั้งแต่เริ่มต้น ด้วยโปรแกรมคอมไพเลอร์ที่รวดเร็วในปัจจุบัน สิ่งนี้ไม่ได้สร้างความแตกต่างมากนัก แต่ก็ยังมีเหตุผลที่จะใช้มัน

ประเภทของห้องสมุด

ฉันเคยกล่าวถึงไลบรารีแบบคงที่ไปแล้ว แต่โดยทั่วไปแล้ว มีไลบรารีซอฟต์แวร์พื้นฐานอยู่สองประเภท:

  • ไลบรารีแบบคงที่ ไลบรารีที่โมดูลถูกผูกไว้ในไฟล์ปฏิบัติการ ก่อน ดำเนินการ ไลบรารีแบบคงที่มักมีชื่อว่า libname.a ส่วนต่อท้าย .a หมายถึง ไฟล์เก็บถาวร
  • ไลบรารีไดนามิก ไลบรารีที่โมดูลสามารถเชื่อมโยงเข้ากับโปรแกรมปฏิบัติการได้ในขณะรันไทม์ ไลบรารีแบบไดนามิกมักมีชื่อว่า libname.so ส่วนต่อท้าย .so อ้างถึง วัตถุที่ใช้ร่วมกัน

ทำไมคุณถึงใช้ห้องสมุด?

ไลบรารี ไม่ว่าจะเป็นไดนามิกหรือสแตติกสามารถเป็นเครื่องมือที่ช่วยประหยัดเวลาที่มีประโยชน์ได้จริงๆ เว้นแต่ว่าคุณมีสถานการณ์ เฉพาะเจาะจงมาก เพื่อให้ฟังก์ชันของคุณบรรลุผล มีโอกาสที่คนอื่นได้สร้างฟังก์ชันที่ทำในสิ่งที่คุณต้องการให้ทำแล้ว ไม่จำเป็นต้องสร้างวงล้อขึ้นมาใหม่ทุกครั้งที่คุณเขียนโค้ด ในเมื่อคนอื่นคิดค้นมันขึ้นมาให้คุณ

ในกรณีที่คุณต้องการเขียน Function ของตัวเองทั้งสำหรับการเรียนหรือทำ Project การใช้ Libraries จะช่วยประหยัดเวลาในการ Compile โดยที่คุณไม่จำเป็นต้อง Link ฟังก์ชั่นเฉพาะที่คุณใช้ในโปรแกรมที่คุณกำลังเขียนในคำสั่ง Compile ทุกครั้ง ต้องการคอมไพล์โปรแกรม โดยรวมแล้วห้องสมุดก็ win win

ห้องสมุดทำงานอย่างไร

ห้องสมุดอย่างที่ฉันบอกไปในตอนแรกทำหน้าที่เหมือนกับห้องสมุดทางกายภาพทั่วไปตรงที่เป็นแหล่งรวบรวมข้อมูล ไฟล์อ็อบเจ็กต์ (ส่วนของโค้ดที่ได้รับการคอมไพล์ก่อนขั้นตอนการเชื่อมโยง) มีฟังก์ชันที่โปรแกรมของคุณสามารถเรียกใช้เพื่อทำงานต่างๆ ได้ ไฟล์เหล่านี้ถูกจัดเก็บไว้ในไลบรารีแล้วจัดทำดัชนีเพื่อให้คอมไพเลอร์สามารถค้นหาไฟล์เหล่านั้นในไลบรารีดังกล่าว ในกรณีของไลบรารีแบบคงที่ หรือเพื่อให้โปรแกรมสามารถค้นหาไฟล์เหล่านั้นได้เมื่อมีการดำเนินการในกรณีของไลบรารีไดนามิก

วิธีสร้างไลบรารีแบบคงที่

คุณสามารถสร้างไลบรารีได้โดยใช้ gcc เพื่อสร้างไฟล์อ็อบเจ็กต์สำหรับไฟล์ .c ที่คุณต้องการเพิ่มลงในไลบรารีโดยใช้โค้ดนี้

gcc -Wall -pedantic -Werror -Wextra -c example.c

ซึ่งจะส่งผลให้ได้ไฟล์ชื่อ “example.o” ที่คุณจะระบุเมื่อสร้างไลบรารี่โดยใช้คำสั่ง ar ซึ่งคุณสามารถทำได้โดยเขียนสิ่งนี้:

ar rcs libproj.a example.o

บทกวีก่อนหน้านี้จะสร้างไฟล์ไลบรารีชื่อ "libproj.a" ซึ่งจะมี "example.o" อยู่ในนั้น แฟล็ก r บนคำสั่ง ar บอกให้แทนที่ไฟล์เก่าด้วยไฟล์ล่าสุด หากมีไลบรารีอยู่ และแฟล็ก c บอกให้สร้างไลบรารีใหม่ หากไม่มีไฟล์นั้นอยู่แล้ว แฟล็ก s จัดทำดัชนีไลบรารีหรืออัปเดตดัชนี ซึ่งคุณสามารถทำได้โดยใช้ ranlib เช่นนี้

ranlib libproj.a

วิธีใช้ไลบรารีแบบคงที่

nm libproj.a

คุณสามารถใช้คำสั่งนี้เพื่อดูฟังก์ชันในไลบรารีของคุณ

gcc -L. main.c -lproj -o project

โค้ดด้านบนรวบรวมโปรแกรมของคุณโดยใช้แฟล็ก -L เพื่อรวมเส้นทางไปยังไลบรารีของคุณ

  • ยกเว้นคำนำหน้า lib และส่วนต่อท้าย .a เพื่อรวมไลบรารีของคุณ

คำสั่งด้านบนจะสร้างไฟล์ปฏิบัติการสำหรับ main.c และใช้ฟังก์ชันใดๆ ในไลบรารี libproj.a ของเรา ธง -L. จะบอกลิงเกอร์ว่าไลบรารีที่เราใช้อยู่ในไดเร็กทอรีปัจจุบันของเรา จริงๆ แล้วส่วน -lproj ของคำสั่งของเราคือชื่อห้องสมุดของเราที่ไม่มี lib และ .a โดยมี -l ติดอยู่ด้านหน้า ตัวเชื่อมโยงจะเพิ่มส่วนของชื่อไลบรารีกลับในขณะที่ค้นหาไฟล์ไลบรารี

โดยสรุป ห้องสมุดเป็นเครื่องมือที่มีประสิทธิภาพซึ่งช่วยเพิ่มประสิทธิภาพของเราโดยช่วยให้เรามุ่งเน้นไปที่งานที่ทำอยู่โดยไม่ต้องกังวลกับรายละเอียดทั้งหมดเกี่ยวกับวิธีการทำงานเบื้องหลัง ฉันชอบคิดไปในทิศทางเดียวกับที่ผู้สร้างไม่ต้องกังวลเรื่องการผลิตสว่านหรือค้อน เมื่อพวกเขาสามารถซื้อสว่านที่เหมาะกับความต้องการของพวกเขาได้ และถูกสร้างขึ้นโดยคนที่มีความรู้มากกว่าพวกเขาในการสร้างสิ่งเหล่านี้ . ในสถานการณ์เช่นนี้ ไลบรารีคือกล่องเครื่องมือที่มีเครื่องมือในการแลกเปลี่ยนสำหรับวิศวกรซอฟต์แวร์