ไลบรารีลิงก์ CRT มีอยู่ 4 เวอร์ชันใน vc \ lib:
- libcmt.lib: ไลบรารีลิงก์ CRT แบบคงที่สำหรับ release build (/ MT)
- libcmtd.lib: ไลบรารีลิงก์ CRT แบบคงที่สำหรับการสร้างข้อบกพร่อง (/ MTd)
- msvcrt.lib: นำเข้าไลบรารีสำหรับรุ่น DLL ของ CRT (/ MD)
- msvcrtd.lib: นำเข้าไลบรารีสำหรับรุ่น debug DLL ของ CRT (/ MDd)
ดูตัวเลือก linker, โครงการ + คุณสมบัติ, Linker, Command Line โปรดสังเกตว่าไลบรารีเหล่านี้ไม่ได้กล่าวถึงที่นี่ ตัวลิงก์จะระบุว่าสวิตช์ / M ถูกใช้โดยคอมไพเลอร์อย่างไรและควรจะเชื่อมโยงกับ. lib ผ่านทางคำสั่ง #pragma สำคัญคุณจะได้รับข้อผิดพลาดในการเชื่อมโยงที่น่ากลัวและยากที่จะวินิจฉัยข้อผิดพลาดรันไทม์หากมีความไม่ตรงกันระหว่างตัวเลือก / M และ. lib ที่คุณเชื่อมโยงด้วย
คุณจะเห็นข้อความแสดงข้อผิดพลาดที่คุณยกมาเมื่อมีการบอกให้ linker เชื่อมโยงไปยัง msvcrt.lib และ libcmt.lib ซึ่งจะเกิดขึ้นหากคุณเชื่อมโยงรหัสที่คอมไพล์ด้วย / MT ด้วยรหัสที่เชื่อมโยงกับ / MD สามารถมี CRT ได้เพียงเวอร์ชันเดียวเท่านั้น
/ NODEFAULTLIB บอกให้ linker ละเว้นคำสั่ง #pragma comment ที่สร้างขึ้นจากโค้ดที่คอมไพล์แล้ว / MT สิ่งนี้อาจใช้งานได้แม้ว่าข้อผิดพลาดตัวเชื่อมโยงอื่น ๆ จะไม่ผิดปกติ สิ่งที่ชอบerrnoซึ่งเป็น int ภายนอกในรุ่น CRT คงที่ แต่แมโคร -ed ไปยังฟังก์ชั่นในรุ่น DLL คนอื่น ๆ เช่นนั้น
แก้ไขปัญหานี้ให้ถูกต้องค้นหาไฟล์. obj หรือ. lib ที่คุณกำลังเชื่อมโยงซึ่งถูกคอมไพล์ด้วยตัวเลือกผิด / M หากคุณไม่มีเงื่อนงำคุณสามารถค้นหาได้โดยการ grepping ไฟล์. obj / .lib สำหรับ "/ MT"
Btw: ไฟล์ปฏิบัติการ Windows (เช่น version.dll) มีรุ่น CRT ของตัวเองเพื่อทำงานให้เสร็จ มันตั้งอยู่ใน c: \ windows \ system32 คุณไม่สามารถใช้งานได้อย่างน่าเชื่อถือสำหรับโปรแกรมของคุณเองส่วนหัว CRT ไม่สามารถใช้ได้ทุกที่ CRT DLL ที่ใช้โดยโปรแกรมของคุณมีชื่อแตกต่างกัน (เช่น msvcrt90.dll)