Ada 4 versi pustaka tautan CRT yang ada di vc \ lib:
- libcmt.lib: pustaka tautan CRT statis untuk build rilis (/ MT)
- libcmtd.lib: pustaka tautan CRT statis untuk build debug (/ MTd)
- msvcrt.lib: pustaka impor untuk rilis versi DLL CRT (/ MD)
- msvcrtd.lib: pustaka impor untuk versi debug DLL CRT (/ MDd)
Lihat opsi linker, Project + Properties, Linker, Command Line. Perhatikan bagaimana pustaka ini tidak disebutkan di sini. Linker secara otomatis mencari tahu saklar / M apa yang digunakan oleh kompilator dan .lib mana yang harus ditautkan melalui perintah komentar #pragma. Agak penting, Anda akan mendapatkan kesalahan tautan yang mengerikan dan kesalahan runtime sulit didiagnosis jika ada ketidakcocokan antara opsi / M dan .lib yang Anda tautkan.
Anda akan melihat pesan kesalahan yang Anda kutip saat penaut diberi tahu untuk menautkan ke msvcrt.lib dan libcmt.lib. Yang akan terjadi jika Anda menautkan kode yang dikompilasi dengan / MT dengan kode yang ditautkan dengan / MD. Hanya ada satu versi CRT.
/ NODEFAULTLIB memberi tahu linker untuk mengabaikan perintah komentar #pragma yang dihasilkan dari kode yang dikompilasi / MT. Ini mungkin berhasil, meskipun banyak kesalahan linker lain yang tidak biasa. Hal-hal seperti errno , yang merupakan int eksternal dalam versi CRT statis tetapi di-makro ke fungsi dalam versi DLL. Banyak yang lain seperti itu.
Nah, perbaiki masalah ini dengan Cara Yang Benar, cari file .obj atau .lib yang Anda tautkan yang dikompilasi dengan opsi / M yang salah. Jika Anda tidak memiliki petunjuk, Anda dapat menemukannya dengan grep file .obj / .lib untuk "/ MT"
Btw: Windows executable (seperti version.dll) memiliki versi CRT mereka sendiri untuk menyelesaikan pekerjaan mereka. Itu terletak di c: \ windows \ system32, Anda tidak dapat menggunakannya dengan andal untuk program Anda sendiri, header CRT-nya tidak tersedia di mana pun. CRT DLL yang digunakan oleh program Anda memiliki nama yang berbeda (seperti msvcrt90.dll).