C runtime library คืออะไร?


158

จริง ๆ แล้ว C runtime library คืออะไรและใช้ทำอะไร? ฉันกำลังค้นหา Googling เหมือนปีศาจ แต่ฉันไม่สามารถหาอะไรที่ดีไปกว่าของ Microsoft: "ไลบรารีรันไทม์ของ Microsoft ให้รูทีนสำหรับการเขียนโปรแกรมสำหรับระบบปฏิบัติการ Microsoft Windows รูทีนเหล่านี้ทำให้งานการเขียนโปรแกรมทั่วไปที่ไม่ได้จัดเตรียมไว้โดยอัตโนมัติ ภาษา C และ C ++ "

ตกลงฉันเข้าใจแล้ว แต่ยกตัวอย่างว่ามีlibcmt.libอะไรเกิดขึ้นบ้าง มันทำอะไร? ฉันคิดว่า C standard library เป็นส่วนหนึ่งของคอมไพเลอร์ C ดังนั้นจะlibcmt.libใช้งาน Windows ของฟังก์ชั่น C ห้องสมุดมาตรฐานในการทำงานภายใต้ win32?

คำตอบ:


71

ใช่ libcmt คือการใช้งาน (หนึ่งในหลาย ๆ ) ของไลบรารีมาตรฐาน C ที่มาพร้อมกับคอมไพเลอร์ของ Microsoft พวกเขามีทั้ง "debug" และ "release" รุ่นของไลบรารีพื้นฐานสามประเภท: single-threaded (ลิงก์แบบสแตติกเสมอ), multi-threaded statically linked , และmulti-threaded dynamically links (แม้ว่าขึ้นอยู่กับเวอร์ชั่นคอมไพเลอร์ที่คุณกำลัง ใช้บางส่วนอาจไม่ปรากฏ)

ดังนั้นในชื่อ "libcmt", "libc" เป็นชื่อดั้งเดิม (มากหรือน้อย) ของไลบรารี C "mt" หมายถึง "มัลติเธรด" รุ่น "ดีบั๊ก" จะมี "d" เพิ่มท้ายให้ "libcmtd"

เท่าที่มันมีฟังก์ชั่นมาตรฐาน C (ตอนที่ 7 ถ้าคุณสนใจ) กำหนดชุดของฟังก์ชั่นการดำเนินการสอดคล้อง (โฮสต์) จะต้องจัดหา ผู้ขายส่วนใหญ่ (รวมถึง Microsoft) เพิ่มฟังก์ชั่นอื่น ๆ อีกมากมาย (สำหรับความเข้ากันได้เพื่อให้ความสามารถของฟังก์ชั่นมาตรฐานที่ไม่ได้กล่าวถึง) ในกรณีส่วนใหญ่มันจะมีฟังก์ชั่น "ภายใน" ที่ใช้โดยคอมไพเลอร์ แต่ไม่ปกติโดยผู้ใช้

หากคุณต้องการรับรายการฟังก์ชันทั้งหมดใน "libcmt" (เพื่อใช้ตัวอย่างของคุณ) คุณสามารถเปิดหนึ่งในคำสั่ง Visual Studio พร้อมท์ (ภายใต้ "Visual Studio Tools" ตามปกติ) ให้เปลี่ยนเป็นไดเรกทอรีที่ห้องสมุดของคุณอยู่ ติดตั้งแล้วพิมพ์ดังนี้: lib -list libcmt.libและจะสร้างรายการ ( ยาว ) ชื่อของไฟล์วัตถุทั้งหมดในไลบรารีนั้น ผู้ที่ไม่เคยตรงตามลักษณะตรงกับชื่อของฟังก์ชั่น แต่โดยทั่วไปจะให้ความคิด หากคุณต้องการดูไฟล์อ็อบเจ็กต์เฉพาะคุณสามารถใช้lib -extractเพื่อแยกหนึ่งในอ็อบเจ็กต์ไฟล์เหล่านั้นจากนั้นใช้dumpbin /symbols <object file name>เพื่อค้นหาว่าฟังก์ชันใดที่ / อยู่ในไฟล์อ็อบเจ็กต์นั้น


37
คุณไม่ได้บอกว่า "C runtime library" คืออะไร !!
onmyway133

4
@entropy: แน่นอนว่าฉันดูเหมือนว่าฉัน แต่คำตอบสั้น ๆ ก็คือมันเป็นชุดของฟังก์ชั่นจำนวนมาก (แต่ไม่จำเป็นต้องทั้งหมด) ซึ่งมีการระบุไว้ในส่วนที่ 7 ของมาตรฐาน C
Jerry Coffin

3
คำตอบนี้บอกเป็นนัยถึงไลบรารี C เป็นเพียงส่วนหนึ่งของเครื่องมือคอมไพเลอร์ ไม่ถูกต้อง
jiggunjer

@JerryCoffin คำถาม: ดังนั้นstrcpyฟังก์ชั่นจากไลบรารีมาตรฐาน C เช่นนั้นจะมีการนำไปใช้ในไลบรารีรันไทม์หรือจะมีเพียงแค่โค้ดในไฟล์. c ปกติหรือไม่
forumulator

@forumulator: โดยปกติจะมีซอร์สโค้ดในไฟล์. c ที่ได้รับการคอมไพล์เพื่อสร้างไลบรารี่มาตรฐานที่เหมาะสม (เช่น. dll, lib, .a, .so หรืออะไรก็ตามที่เกิดขึ้นกับระบบที่คุณใช้) .
Jerry Coffin

57

ตอนแรกเราควรเข้าใจว่า Runtime Library คืออะไร; และคิดว่ามันอาจหมายถึงอะไรโดย "Microsoft C Runtime Library"

ดู: http://en.wikipedia.org/wiki/Runtime_library

ฉันโพสต์บทความส่วนใหญ่ที่นี่เพราะอาจได้รับการอัปเดต

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

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

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

แนวคิดของไลบรารีรันไทม์ไม่ควรสับสนกับไลบรารีโปรแกรมทั่วไปเช่นที่สร้างขึ้นโดยแอ็พพลิเคชันโปรแกรมเมอร์หรือส่งโดยบุคคลที่สามหรือไลบรารีแบบไดนามิกซึ่งหมายถึงไลบรารีโปรแกรมที่ลิงก์ในเวลาทำงาน ตัวอย่างเช่นภาษาการเขียนโปรแกรม C ต้องการเพียงไลบรารีรันไทม์ขั้นต่ำ (โดยทั่วไปเรียกว่า crt0) แต่กำหนดไลบรารีมาตรฐานขนาดใหญ่ (เรียกว่าไลบรารีมาตรฐาน C) ที่การใช้งานแต่ละครั้งจะต้องส่งมอบ


3
ประโยคที่ไฮไลต์เป็นวิธีที่แตกต่างจากไลบรารีมาตรฐานคือคำตอบที่ถูกต้องสั้น ๆ แรกที่ฉันเห็นว่าไม่ผ่านการ "มากที่สุด" หรือ "บางครั้ง"
nik.shornikov

@ nik.shornikov: นั่นเป็นเพราะคำอธิบายอื่น ๆ พยายามที่จะแม่นยำยิ่งขึ้น แม้ว่ามันจะเป็นความจริงที่ว่าไลบรารีมาตรฐานนั้นมักจะมีเฉพาะคอมไพเลอร์และแพลตฟอร์ม ยกตัวอย่างเช่นอย่างน้อยบางเวอร์ชั่นทั้ง Mingw และ C ++ ของ Intel คอมไพเลอร์สำหรับ Windows ได้ใช้ไลบรารี่มาตรฐานของ Microsoft มากกว่าที่จะให้ตัวเอง เช่นเดียวกัน Clang บน Linux สามารถติดตั้ง (และบ่อยครั้ง) เพื่อใช้ไลบรารีมาตรฐานในการติดตั้ง gcc ที่มีอยู่แทนที่จะติดตั้งไลบรารีอื่นสำหรับตัวเอง
Jerry Coffin

ฉันแน่ใจว่าเป็นไปได้ที่จะเขียนการใช้งานของทั้งไลบรารีมาตรฐาน C และ C ++ ที่สามารถพกพาไปยังแพลตฟอร์มใด ๆ ที่สนับสนุน POSIX
Jerry Coffin

21

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

ในภาษาโปรแกรม C ทุกโปรแกรมเริ่มต้นด้วยmain()ฟังก์ชั่น ภาษาอื่นอาจกำหนดฟังก์ชั่นอื่น ๆ ที่โปรแกรมเริ่มทำงาน main()แต่การประมวลผลไม่ทราบ โปรเซสเซอร์รู้คำสั่งที่กำหนดไว้ล่วงหน้าเพียงตัวแทนจากการรวมกันของและ01

ในการเขียนโปรแกรมไมโครโปรเซสเซอร์ไม่มีระบบปฏิบัติการพื้นฐาน (Microsoft Windows, Linux, MacOS, .. ) คุณต้องบอกโปรเซสเซอร์อย่างชัดเจนว่าจะเริ่มต้นอย่างไรโดยการตั้งค่าProgramCounter(PC) ที่วนซ้ำและกระโดด (ลูปการเรียกใช้ฟังก์ชัน) ภายใน คำสั่งที่รู้จักกับโปรเซสเซอร์ คุณจำเป็นต้องรู้ว่า RAM มีขนาดใหญ่แค่ไหนคุณต้องกำหนดตำแหน่งของสแต็กโปรแกรม (ตัวแปรโลคัล) รวมถึงตำแหน่งของฮีป (ตัวแปรไดนามิก) และตำแหน่งของตัวแปรทั่วโลก (ฉันเดาว่ามันเรียกว่า SSA ?) ภายใน RAM โปรเซสเซอร์เดียวสามารถดำเนินการได้ครั้งละหนึ่งโปรแกรมเท่านั้น

นั่นคือที่มาของระบบปฏิบัติการระบบปฏิบัติการนั้นเป็นโปรแกรมที่ทำงานบนโปรเซสเซอร์ โปรแกรมที่อนุญาตให้เรียกใช้งานโค้ดที่กำหนดเอง เรียกใช้หลาย ๆ โปรแกรมในเวลาเดียวกันโดยสลับระหว่างรหัสการเรียกใช้ของโปรแกรม (ซึ่งโหลดลงใน RAM) แต่ระบบปฏิบัติการเป็นโปรแกรมแต่ละโปรแกรมเขียนแตกต่างกัน เพียงแค่ใส่รหัสของโปรแกรมที่คุณกำหนดเองลงใน RAM จะไม่เรียกใช้ระบบปฏิบัติการจะไม่ทราบ คุณต้องเรียกใช้ฟังก์ชั่นบนระบบปฏิบัติการที่ลงทะเบียนโปรแกรมของคุณบอกระบบปฏิบัติการว่าหน่วยความจำของโปรแกรมต้องการหน่วยความจำเท่าใดโดยที่จุดเข้าสู่โปรแกรมอยู่ (main()ฟังก์ชั่นในกรณีของ C) และนี่คือสิ่งที่ฉันคิดว่าตั้งอยู่ใน Runtime Library และอธิบายว่าทำไมคุณต้องมีไลบรารี่พิเศษสำหรับแต่ละระบบปฏิบัติการเพราะสิ่งเหล่านี้เป็นเพียงโปรแกรมของตัวเองและมีฟังก์ชั่นต่าง ๆ ในการทำสิ่งเหล่านี้

สิ่งนี้ยังอธิบายว่าเหตุใดจึงไม่เชื่อมโยงแบบไดนามิกที่รันไทม์เหมือน.dllไฟล์แม้ว่าจะถูกเรียกว่า RUNTIME Library Runtime Library จำเป็นต้องเชื่อมโยงแบบคงที่เนื่องจากจำเป็นเมื่อเริ่มต้นโปรแกรมของคุณ Runtime Library ฉีด / เชื่อมต่อโปรแกรมที่คุณกำหนดเองเข้ากับ / ไปยังโปรแกรมอื่น (ระบบปฏิบัติการ) ที่ RUNTIME นี่เป็นสาเหตุที่ทำให้สมองบางอย่าง ...

สรุป: RUNTIME Library ล้มเหลวในการตั้งชื่อ อาจจะไม่เคยมี.dll(การเชื่อมโยงที่รันไทม์) ในครั้งแรกและปัญหาของการทำความเข้าใจความแตกต่างก็ไม่ได้อยู่ แต่แม้ว่าสิ่งนี้จะเป็นความจริง

ชื่อที่ดีขึ้นสำหรับ Runtime Library อาจเป็น: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

หวังว่าฉันจะทำให้ถูกต้องขึ้นสำหรับการแก้ไข / การขยายตัว ไชโย


1
ฉันยังไม่ได้รับอุดมคติ เหตุใดโปรแกรมจึงต้องการบางสิ่งที่รันไทม์ ทำไมรหัสไบนารี่จึงไม่สามารถทำงานได้อย่างเดียว 100% โดยไม่มีสิ่งใดสนับสนุนในการรันไทม์? หรือกล่าวอีกนัยหนึ่ง: เป็นไปได้ไหมที่จะมีรหัสที่ทำงาน 100% โดยไม่มีสิ่งใด (รวมถึงระบบปฏิบัติการ)?
MarcioAB

5
ในทางทฤษฎีแล้วโปรแกรมไม่จำเป็นต้องมี RTL อย่างไรก็ตามโปรแกรมของคุณจะแสดงผลลัพธ์หรือรับอินพุตหรือร้องขอหน่วยความจำได้อย่างไรโดยไม่มีความร่วมมือจากระบบปฏิบัติการ
SN

16

C เป็นภาษาและในความหมายของมันไม่จำเป็นต้องมีฟังก์ชั่นใด ๆ ไม่มี IO ไม่มีการคำนวณทางคณิตศาสตร์และอื่น ๆ ตามแบบแผนมีชุดของกิจวัตรที่คุณสามารถเชื่อมโยงไปยังปฏิบัติการของคุณได้ แต่คุณไม่จำเป็นต้องใช้มัน อย่างไรก็ตามนี่เป็นเรื่องธรรมดาที่ผู้ทำลิงก์ส่วนใหญ่ไม่ขอให้คุณเชื่อมโยงไปยัง C runtime library อีกต่อไป

มีหลายครั้งที่คุณไม่ต้องการตัวอย่างเช่นในการทำงานกับระบบฝังตัวอาจเป็นไปไม่ได้ที่จะมี malloc เป็นต้น ฉันเคยทำงานเกี่ยวกับการฝัง PostScript ไว้ในเครื่องพิมพ์และเรามีไลบรารีรันไทม์ของเราเองซึ่งมีความสุขมากในระบบฝังตัวดังนั้นเราจึงไม่ใส่ใจกับ "มาตรฐาน"


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

10

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

คำอธิบายที่ดีเกี่ยวกับตัวเลือกต่าง ๆ สำหรับไลบรารีรันไทม์: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

มันรวมฟังก์ชั่นเหล่านั้นตามปกติแล้วคุณไม่คิดว่าจะต้องมีห้องสมุดเพื่อโทร:

  • malloc
  • enum, struct
  • เอบีเอส, นาที
  • ยืนยัน

Microsoft มีรายการฟังก์ชันไลบรารีรันไทม์ที่ดี:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

รายการฟังก์ชันที่แน่นอนจะแตกต่างกันไปขึ้นอยู่กับคอมไพเลอร์ดังนั้นสำหรับ iOS คุณจะได้รับฟังก์ชั่นอื่น ๆ เช่น dispatch_async () หรือ NSLog ()


1
struct และ enum เป็นไลบรารีรันไทม์จริงๆหรือไม่
Dean P

6

หากคุณใช้เครื่องมือเช่นDependency Walkerในการปฏิบัติการที่รวบรวมจาก C หรือ C ++ คุณจะเห็นว่าหนึ่งใน DLLs นั้นขึ้นอยู่กับว่าเป็น MSVCRT.DLL นี่คือ Microsoft C Runtime Library หากคุณตรวจสอบ MSVCRT.DLL เพิ่มเติมด้วย DW คุณจะเห็นว่านี่คือที่ที่ฟังก์ชันทั้งหมดเช่น printf (), ใส่ (0, รับ (), atoi () ฯลฯ ถ่ายทอดสด


6
เฉพาะในขณะที่คอมไพล์ไฟล์สั่งการนั้นรันไทม์ C นั้นถูกลิงก์แบบไดนามิก หากมีการเชื่อมโยงแบบคงที่วอล์คเกอร์พึ่งพาจะแสดง nothiing
Eli Bendersky

4

ฉันคิดว่าความหมายของ Microsoft หมายถึง:

การใช้งาน Microsoft ของไลบรารีรันไทม์ C มาตรฐานให้ ...


3

มีไลบรารี C Run-time สามรูปแบบที่จัดมาพร้อมกับ Win32 SDK

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ รุ่น 32 บิตมีสามแบบฟอร์มเหล่านี้เช่นกันอย่างไรก็ตาม CRT ใน DLL ชื่อ MSVCRT.LIB DLL สามารถแจกจ่ายต่อได้ ชื่อขึ้นอยู่กับรุ่นของ VC ++ (เช่น MSVCRT10.DLL หรือ MSVCRT20.DLL) อย่างไรก็ตามโปรดทราบว่า MSVCRT10.DLL ไม่ได้รับการสนับสนุนบน Win32s ในขณะที่ CRTDLL.LIB ได้รับการสนับสนุนบน Win32s MSVCRT20.DLL มีสองรุ่น: หนึ่งรุ่นสำหรับ Windows NT และรุ่นอื่นสำหรับ Win32s

ดู: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.