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).
/verbose:lib
opsi penaut tambahan. Ini menunjukkan urutan file .lib dimuat, memungkinkan Anda untuk melihat di mana yang salah ditarik masuk.Ini berarti bahwa salah satu dll dependen dikompilasi dengan pustaka run-time yang berbeda .
Proyek -> Properti -> C / C ++ -> Pembuatan Kode -> Perpustakaan Runtime
Pergi ke semua perpustakaan dan lihat bahwa mereka dikompilasi dengan cara yang sama.
Lebih lanjut tentang kesalahan ini di tautan ini:
peringatan LNK4098: defaultlib "LIBCD" konflik dengan penggunaan libs lain
sumber
Tautan IMO dari Yochai Timmer ini sangat bagus dan relevan tetapi menyakitkan untuk dibaca. Saya menulis ringkasan.
Yochai, jika Anda pernah membaca ini, silakan lihat catatan di bagian akhir.
Untuk postingan asli baca: peringatan LNK4098: defaultlib "LIBCD" bentrok dengan penggunaan libs lain
Kesalahan
Berarti
Bagaimana mengatasinya
Yang terakhir, seperti yang disebutkan di posting asli, dua masalah umum dapat muncul:
Untuk kasus tersebut, pastikan Anda memahami masalahnya dan memutuskan di antara solusinya.
Catatan: Saya ingin memasukkan ringkasan tautan Yochai Timmer ke dalam jawabannya sendiri, tetapi karena beberapa orang mengalami kesulitan untuk meninjau hasil edit dengan benar, saya harus menulisnya di jawaban terpisah. Maaf
sumber
Saya mendapatkan ini setiap kali saya ingin membuat aplikasi di VC ++.
Klik kanan proyek, pilih Properties lalu di bawah 'Configuration properties | C / C ++ | Code Generation ', pilih "Multi-threaded Debug (/ MTd)" untuk konfigurasi Debug.
Perhatikan bahwa ini tidak mengubah pengaturan untuk konfigurasi Rilis Anda - Anda harus pergi ke lokasi yang sama dan memilih "Multi-threaded (/ MT)" untuk Rilis.
sumber
Klik kanan proyek, pilih Properties lalu di bawah 'Configuration properties | Linker | Masukan | Abaikan Library tertentu dan tulis msvcrtd.lib
sumber