Vc \ lib dosyasında bulunan CRT bağlantı kitaplıklarının 4 sürümü vardır:
- libcmt.lib: sürüm derlemesi (/ MT) için statik CRT bağlantı kitaplığı
- libcmtd.lib: Hata ayıklama derlemesi için statik CRT bağlantı kitaplığı (/ MTd)
- msvcrt.lib: CRT'nin (/ MD) sürüm DLL sürümü için içe aktarma kitaplığı
- msvcrtd.lib: CRT (/ MDd) hata ayıklama DLL sürümü için alma kitaplığı
Bağlayıcı seçeneklerine, Proje + Özellikleri, Bağlayıcı, Komut Satırı'na bakın. Bu kütüphanelerin burada nasıl bahsedilmediğine dikkat edin. Bağlayıcı, derleyici tarafından hangi / M anahtarının kullanıldığını ve # .pragma açıklama yönergesi ile hangi .lib'in bağlanması gerektiğini otomatik olarak bulur. Önemli olarak, / M seçeneği ile bağlandığınız .lib arasında bir uyumsuzluk olsaydı korkunç bağlantı hataları ve çalışma zamanı hatalarını teşhis etmek zor olurdu.
Sen bağlayıcı MSVCRT.LIB bağlantısını hem anlattı durumdayken alıntı hata mesajı görürsünüz ve LIBCMT.LIB. / MT ile derlenen kodu / MD ile bağlantılı kodla bağlarsanız bu gerçekleşir. CRT'nin yalnızca bir sürümü olabilir.
/ NODEFAULTLIB, bağlayıcıya / MT derlenmiş kodundan oluşturulan #pragma comment yönergesini yoksaymasını söyler. Diğer linker hatalarının bir kısmı nadir olmasa da bu işe yarayabilir. Errno gibi şeyler , statik CRT sürümünde bir extern int olan ancak DLL sürümünde bir işleve makro olarak düzenlenmiş. Diğer pek çok kişi böyle.
Peki, bu sorunu doğru şekilde düzeltin, bağladığınız .obj veya .lib dosyasını yanlış / M seçeneğiyle derleyin. Eğer bir ipucunuz yoksa "/ MT" için .obj / .lib dosyalarını açarak bulabilirsiniz.
Btw: Windows yürütülebilir dosyaları (version.dll gibi) işlerini yapmak için kendi CRT sürümlerine sahiptir. C: \ windows \ system32 içinde bulunur, kendi programlarınız için güvenilir bir şekilde kullanamazsınız, CRT başlıkları hiçbir yerde mevcut değildir. Programınız tarafından kullanılan CRT DLL farklı bir ada sahip (msvcrt90.dll gibi).