Di Visual Studio, ada flag kompilasi / MD dan / MT yang memungkinkan Anda memilih jenis perpustakaan runtime C yang Anda inginkan.
Saya mengerti perbedaan dalam implementasi, tetapi saya masih tidak yakin yang mana yang akan digunakan. Apa pro / kontra?
Salah satu keuntungan / MD yang saya dengar, adalah ini memungkinkan seseorang untuk memperbarui runtime, (seperti mungkin memperbaiki masalah keamanan) dan aplikasi saya akan mendapat manfaat dari pembaruan ini. Meskipun bagi saya, ini hampir tampak seperti fitur non-: Saya tidak ingin orang mengubah runtime saya tanpa mengizinkan saya untuk menguji terhadap versi baru!
Beberapa hal yang membuat saya penasaran:
- Bagaimana ini akan memengaruhi waktu membangun? (agaknya / MT sedikit lebih lambat?)
- Apa implikasi lainnya?
- Mana yang paling banyak digunakan orang?
Jawaban:
Dengan menghubungkan secara dinamis dengan / MD,
Saya juga menemukan bahwa dalam praktiknya, ketika bekerja dengan perpustakaan biner pihak ke-3 yang terhubung secara statis yang telah dibangun dengan opsi runtime yang berbeda, / MT dalam aplikasi utama cenderung menyebabkan konflik lebih sering daripada / MD (karena Anda akan mengalami masalah jika runtime C dihubungkan secara statis beberapa kali, terutama jika mereka versi yang berbeda).
sumber
/MT
akan sedikit lebih cepat saat runtime karena aplikasi Anda tidak perlu mencari implementasi fungsi runtime setiap kali, saya bukan ahli di level ini tapi saya cukup yakin sebagian besar OS akan men-cache implementasi runtime sehingga aplikasi Anda akan menggunakan versi yang di-cache, jadi perbedaannya tidak akan terlalu jauh, CATATAN yang saya sebutkan bahwa saya tidak yakin jadi jangan menganggap komentar ini sebagai argumen.Jika Anda menggunakan DLL maka Anda harus menggunakan CRT (/ MD) yang terhubung secara dinamis.
Jika Anda menggunakan CRT dinamis untuk .exe dan semua. lain.
Jika Anda menggunakan CRT statis untuk .exe dan semua .dlls maka mereka semua akan mendapatkan salinan CRT yang terpisah - yang berarti mereka semua akan menggunakan tumpukan CRT mereka sendiri sehingga memori harus dibebaskan dalam modul yang sama di mana ia dialokasikan. Anda juga akan menderita kode mengasapi (beberapa salinan CRT) dan kelebihan overhead runtime (setiap heap mengalokasikan memori dari OS untuk melacak keadaannya, dan overhead dapat terlihat).
sumber
Saya percaya standar untuk proyek yang dibangun melalui Visual Studio adalah / MD.
Jika Anda menggunakan / MT, executable Anda tidak akan bergantung pada DLL yang ada pada sistem target. Jika Anda membungkus ini dengan installer, itu mungkin tidak akan menjadi masalah dan Anda bisa memilih yang mana saja.
Saya menggunakan / MT sendiri, sehingga saya bisa mengabaikan seluruh kekacauan DLL.
PS Seperti yang ditunjukkan oleh Pak Fooz , penting untuk konsisten. Jika Anda terhubung dengan perpustakaan lain, Anda perlu menggunakan opsi yang sama seperti yang mereka lakukan. Jika Anda menggunakan DLL pihak ketiga, hampir pasti Anda harus menggunakan versi DLL dari perpustakaan runtime.
sumber
Saya lebih suka menghubungkan secara statis dengan / MT.
Meskipun Anda mendapatkan executable yang lebih kecil dengan / MD, Anda masih harus mengirimkan banyak DLL untuk memastikan pengguna mendapatkan versi yang tepat untuk menjalankan program Anda. Dan pada akhirnya installer Anda akan menjadi LEBIH BESAR daripada saat menghubungkan dengan / MT.
Yang lebih parah lagi, jika Anda memilih untuk meletakkan pustaka runtime di direktori windows, cepat atau lambat pengguna akan menginstal aplikasi baru dengan pustaka yang berbeda dan, dengan sedikit sial, hancurkan aplikasi Anda.
sumber
Masalah yang akan Anda hadapi / MD adalah bahwa versi target CRT mungkin tidak ada di mesin pengguna Anda (terutama jika Anda menggunakan Visual Studio versi terbaru dan pengguna memiliki sistem operasi yang lebih lama).
Dalam hal ini Anda harus mencari cara untuk mendapatkan versi yang tepat di mesin mereka.
sumber
dari http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Jadi jika saya mengartikannya dengan benar maka / tautan MT statis dan / tautan MD secara dinamis.
sumber
Jika Anda membangun executable yang menggunakan dll atau lib lain daripada / MD opsi lebih disukai karena dengan cara itu semua komponen akan berbagi perpustakaan yang sama. Tentu saja opsi ini harus cocok untuk semua modul yang terlibat yaitu dll / lib / exe.
Jika executable Anda tidak menggunakan lib atau dll daripada panggilan siapa pun. Perbedaannya tidak terlalu banyak sekarang karena aspek berbagi tidak berlaku.
Jadi mungkin Anda dapat memulai aplikasi dengan / MT karena tidak ada alasan kuat sebaliknya, tetapi ketika saatnya untuk menambahkan lib atau dll, Anda dapat mengubahnya ke / MD dengan lib / dll yang mudah.
sumber