আমার / এমডি বা / এমটি দিয়ে সংকলন করা উচিত?


126

ভিজ্যুয়াল স্টুডিওতে, সংকলিত পতাকা / এমডি এবং / এমটি রয়েছে যা আপনাকে পছন্দ করে দেয় যে আপনি কোন ধরণের সি রানটাইম লাইব্রেরি চান।

আমি বাস্তবায়নের পার্থক্যটি বুঝতে পারি তবে কোনটি ব্যবহার করবেন তা এখনও নিশ্চিত নই। উপকারিতা / বিপরীত কি কি?

আমি শুনেছি / এমডির একটি সুবিধা হ'ল এটি কারও রানটাইম আপডেট করার অনুমতি দেয় (যেমন কোনও সুরক্ষা সমস্যা প্যাচ করে) এবং আমার অ্যাপ্লিকেশনটি এই আপডেটটি থেকে উপকৃত হবে। যদিও আমার কাছে এটি প্রায় কোনও অ-বৈশিষ্ট্যের মতো বলে মনে হচ্ছে: আমি চাই না যে লোকেরা আমাকে নতুন সংস্করণের বিরুদ্ধে পরীক্ষা না দিয়ে আমার রানটাইম পরিবর্তন করবে!

কিছু বিষয় সম্পর্কে আমি কৌতূহলী:

  • কীভাবে এটি নির্মাণের সময়গুলিকে প্রভাবিত করবে? (সম্ভবতঃ / এমটি একটু ধীর হয়?)
  • অন্যান্য প্রভাব কি?
  • বেশিরভাগ মানুষ কোনটি ব্যবহার করেন?

1
: আরো তথ্য ও পরামর্শগুলি খুঁজে পাওয়া যেতে পারে stackoverflow.com/questions/787216
Weidenrinde

উত্তর:


85

গতিশীলভাবে / MD এর সাথে সংযুক্ত করে,

  • আপনি সিস্টেম আপডেটের (উন্মুক্ত বা অসুস্থতার জন্য) উন্মুক্ত হয়ে গেছেন,
  • আপনার এক্সিকিউটেবলটি ছোট হতে পারে (যেহেতু এটিতে গ্রন্থাগার এম্বেড থাকে না) এবং
  • আমি বিশ্বাস করি যে খুব কমপক্ষে একটি ডিএলএল কোড বিভাগটি সক্রিয়ভাবে এটি ব্যবহার করা সমস্ত প্রক্রিয়াগুলির মধ্যে ভাগ করা হয় (পুরো পরিমাণে র‌্যাম গ্রহন করে)।

আমি এটিও পেয়েছি যে অনুশীলনে, স্ট্যাটিকালি-লিঙ্কযুক্ত তৃতীয় পক্ষের বাইনারি-কেবলমাত্র লাইব্রেরিগুলি যা বিভিন্ন রানটাইম বিকল্পগুলির সাথে নির্মিত হয়েছিল, যখন / মূল অ্যাপ্লিকেশনটিতে এমডি / এমডি-র তুলনায় অনেক সময় দ্বন্দ্ব ঘটাতে প্রবণতার সাথে কাজ করে থাকে (কারণ আপনি 'সি রানটাইম একাধিকবার স্ট্যাটিকালি লিঙ্কযুক্ত থাকলে বিশেষত যদি সেগুলি ভিন্ন সংস্করণে থাকে তবে তারা সমস্যায় পড়বে।'


10
সিস্টেম আপডেটগুলি কিছুটা এসএক্সএস দ্বারা হ্রাস পেয়েছে।
এক্সইটি

1
এর অর্থ কি আমি যদি এমডি ব্যবহার করে সংকলন করি এবং আমার প্রোগ্রামটি কিছুটা ডিএল-র উপর নির্ভরশীল হয় তবে প্রোগ্রামটি যদি এমন একটি কম্পিউটারে চলছে যেখানে নির্ভরতা ডেল অস্তিত্বহীন থাকে?
জেরিটান

5
@ জিরিটন: হ্যাঁ, আপনাকে নিশ্চিত করতে হবে যে যথাযথ ডিএলএল ব্যবহার করা হচ্ছে এমন সমস্ত কম্পিউটারে উপস্থিত রয়েছে যারা এই সফ্টওয়্যারটি চালাতে চান। এর সাধারণ সমাধানগুলি হল ব্যবহারকারীকে উপযুক্ত এমএসভিসি পুনরায় বিতরণযোগ্য প্যাকেজ ইনস্টল করা, বা এমন কোনও ইনস্টলার ব্যবহার করুন যা সমস্ত কাজ করে।
মিঃ ফুজ

@ রোয়ি আমি নিশ্চিত নই তবে আমি মনে করি /MTরানটাইমের সময় কিছুটা দ্রুত হবে কারণ আপনার অ্যাপ্লিকেশনটির প্রতিবার রানটাইম ফাংশনের বাস্তবায়ন অনুসন্ধান করার দরকার নেই, আমি এই স্তরের বিশেষজ্ঞ নই তবে বেশিরভাগ ক্ষেত্রেই আমি বেশ নিশ্চিত ওএসগুলি রানটাইম বাস্তবায়নগুলি ক্যাশে করবে যাতে আপনার অ্যাপ্লিকেশন ক্যাশেড সংস্করণটি ব্যবহার করবে, সুতরাং পার্থক্যটি এতদূর হবে না, উল্লেখ্য যে আমি উল্লেখ করেছি যে আমি নিশ্চিত নই তাই এই মন্তব্যটিকে তর্ক হিসাবে গ্রহণ করবেন না।
আহমেদ কামাল

34

আপনি যদি ডিএলএল ব্যবহার করছেন তবে আপনার গতিশীল সংযুক্ত সিআরটি (/ এমডি) এর জন্য যাওয়া উচিত।

আপনি যদি আপনার .exe এবং সমস্ত .dlls এর জন্য ডায়নামিক সিআরটি ব্যবহার করেন তবে তারা সকলেই সিআরটি-র একক বাস্তবায়ন ভাগ করে নেবে - যার অর্থ তারা সকলেই একক সিআরটি হিপ এবং একটি .exe / .dll এ বরাদ্দ মেমরি ভাগ করে নিবে অন্য।

আপনি যদি আপনার .exe এবং সমস্ত .dlls জন্য স্থিতিশীল সিআরটি ব্যবহার করেন তবে তারা সকলেই সিআরটি-র একটি পৃথক অনুলিপি পাবেন - যার অর্থ তারা সকলেই তাদের নিজস্ব সিআরটি হিপ ব্যবহার করবেন সুতরাং মেমরিটি একই মডিউলে মুক্তি দিতে হবে বরাদ্দ ছিল। আপনি কোড ব্লাট (সিআরটিটির একাধিক অনুলিপি) এবং অতিরিক্ত রানটাইম ওভারহেড থেকেও ভুগবেন (প্রতিটি হিপ তার অবস্থার উপর নজর রাখতে ওএস থেকে মেমরি বরাদ্দ করে এবং ওভারহেড লক্ষণীয় হতে পারে)।


20

আমি বিশ্বাস করি ভিজ্যুয়াল স্টুডিওর মাধ্যমে নির্মিত প্রকল্পগুলির জন্য ডিফল্ট / এমডি হয়।

আপনি যদি / এমটি ব্যবহার করেন তবে আপনার এক্সিকিউটেবল লক্ষ্য সিস্টেমে উপস্থিত কোনও ডিএলএল নির্ভর করবে না। আপনি যদি এটি কোনও ইনস্টলারে মুড়িয়ে রাখেন তবে এটি সম্ভবত কোনও সমস্যা হবে না এবং আপনি যে কোনও পথে যেতে পারেন।

আমি নিজে / এমটি ব্যবহার করি, যাতে আমি পুরো ডিএলএল জগাখিচুড়ি উপেক্ষা করতে পারি।

পিএস মিঃ ফুজ যেমন উল্লেখ করেছেন, সামঞ্জস্যপূর্ণ হওয়া অত্যাবশ্যক। আপনি যদি অন্য লাইব্রেরির সাথে সংযোগ স্থাপন করেন তবে তাদের একই বিকল্প ব্যবহার করা উচিত। আপনি যদি কোনও তৃতীয় পক্ষের ডিএলএল ব্যবহার করছেন তবে এটি প্রায় নিশ্চিত যে আপনার রানটাইম লাইব্রেরির ডিএলএল সংস্করণ ব্যবহার করা দরকার।


14

আমি স্থিতিশীলভাবে / এমটি এর সাথে লিঙ্ক করতে পছন্দ করি।

আপনি যদি এমডি / এমডি দিয়ে একটি আরও ছোট এক্সিকিউটেবল পান, তবুও আপনাকে আপনার প্রোগ্রামটি চালনার জন্য ব্যবহারকারী সঠিক সংস্করণ পেয়েছে তা নিশ্চিত করার জন্য আপনাকে একগুচ্ছ ডিএলএল বহন করতে হবে। এবং শেষ পর্যন্ত আপনার ইনস্টলারটি / এমটি-র সাথে লিঙ্ক করার চেয়ে আরও বড় হতে চলেছে।

এর চেয়েও খারাপ, যদি আপনি উইন্ডোজ ডিরেক্টরিতে আপনার রানটাইম লাইব্রেরিগুলি রাখার পছন্দ করেন, তাড়াতাড়ি বা পরে ব্যবহারকারী একটি নতুন অ্যাপ্লিকেশন ইনস্টল করতে চলেছে বিভিন্ন লাইব্রেরি এবং কোনও দুর্ভাগ্যের সাথে, আপনার অ্যাপ্লিকেশনটি ভেঙে দেয়।


5
"আপনার রানটাইম লাইব্রেরিগুলি উইন্ডো ডিরেক্টরিতে রাখার জন্য" খুব খারাপ ধারণা। আপনি অন্যান্য বোবা অ্যাপ্লিকেশনগুলি ভাঙ্গতে পারেন যা করার আগে আপনি একই করেছিলেন। এসএক্সএস ব্যবহার করুন এবং ইনস্টলারটিকে এটি পরিচালনা করতে দিন বা / এমটি দিয়ে আটকে দিন।
এমসাল্টার্স

1
আমি পুরোপুরি একমত যে এটি একটি খারাপ ধারণা। কিছু লোক যদিও এটি করেন তাই আমি বর্ণনা করছি যে এটি কেন ভাল ধারণা নয়।
অ্যাড্রিয়ান গ্রিগোর

@ অ্যাড্রিয়ানগ্রিগোর কেন বিভিন্ন লাইব্রেরি সহ একটি নতুন অ্যাপ্লিকেশন আপনার অ্যাপ্লিকেশনটিতে বিরতি সৃষ্টি করবে? আপনি যদি / MD লিঙ্কেজ ব্যবহার করেন তবে আপনি ঠিক লাইব্রেরিগুলির নতুন সংস্করণগুলি লোড করা শুরু করবেন?
rturrado

4
@ আর্টুরাডো: বেশ নয়। আপনার উপরে অন্য অ্যাপ্লিকেশনগুলি ইনস্টল করা পুরানো সংস্করণগুলির সাথে আপনার ঘরগুলি ওভাররাইট করে। নতুন সংস্করণগুলি চলে যাবে। এটি সাধারণত "ডেল হেল" নামে পরিচিত, en.wikedia.org/wiki/DLL_Hell দেখুন
অ্যাড্রিয়ান গ্রিগোর

1
Microsoft ভিসুয়াল স্টুডিও 2010 সালে WinSxS উপর ছেড়ে দিল - রানটাইম লাইব্রেরি এখন পারেন গোপনে বা system32 (ইন স্থাপন করা হয় msdn.microsoft.com/en-us/library/vstudio/dd293574.aspx )।
বিসিআরান

8

আপনি / এমডি দিয়ে যে সমস্যাটি চালিয়ে যাবেন তা হ'ল সিআরটির টার্গেট সংস্করণটি আপনার ব্যবহারকারীদের মেশিনে নাও থাকতে পারে (বিশেষত যদি আপনি ভিজ্যুয়াল স্টুডিওর সর্বশেষতম সংস্করণ ব্যবহার করছেন এবং ব্যবহারকারীর একটি পুরানো অপারেটিং সিস্টেম রয়েছে)।

সেক্ষেত্রে আপনাকে তাদের মেশিনে সঠিক সংস্করণটি কীভাবে পাবেন তা খুঁজে বের করতে হবে।


7

http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx থেকে :

/ এমটি _ এমটি সংজ্ঞায়িত করে যাতে রান-টাইম রুটিনগুলির মাল্টিথ্রিড-নির্দিষ্ট সংস্করণগুলি মানক শিরোনাম (.h) ফাইলগুলি থেকে নির্বাচন করা হয়। এই বিকল্পটি সংকলককে .obj ফাইলে লাইব্রেরির নাম LIBCMT.lib স্থাপনের কারণও দেয় যাতে লিঙ্কারটি বহিরাগত চিহ্নগুলি সমাধান করতে LIBCMT.lib ব্যবহার করবে। হয় / এমটি বা / এমডি (বা তাদের ডিবাগ সমতুল্য / এমটিডি বা / এমডিডি) মাল্টিথ্রেড প্রোগ্রাম তৈরি করতে প্রয়োজনীয়।

/ এমডি _ এমটি এবং _ডিএলএলকে সংজ্ঞায়িত করে যাতে রান-টাইম রুটিনগুলির মাল্টিথ্রেড- এবং ডিএলএল-নির্দিষ্ট সংস্করণ উভয়ই স্ট্যান্ডার্ড .h ফাইলগুলি থেকে নির্বাচন করা হয়। এই বিকল্পটি সংকলককে .obj ফাইলে MSVCRT.lib লাইব্রেরির নাম রাখে।

এই বিকল্পের সাথে সংকলিত অ্যাপ্লিকেশনগুলি স্থিতিশীলভাবে MSVCRT.lib এর সাথে যুক্ত রয়েছে। এই গ্রন্থাগারটি কোডের একটি স্তর সরবরাহ করে যা লিঙ্কারকে বাহ্যিক রেফারেন্সগুলি সমাধান করতে দেয়। আসল ওয়ার্কিং কোডটি এমএসভিসিআর 71.ডিএলএলে অন্তর্ভুক্ত রয়েছে, যা অবশ্যই এমএসভিসিআরটিটি.লিবের সাথে যুক্ত অ্যাপ্লিকেশনগুলিতে রান সময়ে পাওয়া উচিত।

যখন / এসডিটি _STATIC_CPPLIB সংজ্ঞায়িত (/ D_STATIC_CPPLIB) সাথে ব্যবহার করা হয় তখন এটি অ্যাপ্লিকেশনটিকে স্থিরভাবে মূল সিআরটির সাথে ডায়নামিক সংস্করণ (msvcprt.lib) এর পরিবর্তে স্থিতিশীল মাল্ট্রিথ্রেড স্ট্যান্ডার্ড সি ++ লাইব্রেরির (libcpmt.lib) সাথে সংযোগ স্থাপন করবে will msvcrt.lib।

সুতরাং আমি যদি এটির সঠিক ব্যাখ্যা করছি তবে / এমটি লিঙ্কগুলি স্থিতিশীল এবং / এমডি লিঙ্কগুলি গতিশীল।


প্রশ্নটি ছিল "আমার কোনটি ব্যবহার করা উচিত?", এটি কোনও উত্তর নয়।
লিওনার্ড ইনক্রেট

1

আপনি যদি নির্বাহযোগ্য নির্মাণ করে যা / MD বিকল্পের তুলনায় অন্যান্য dlls বা libs ব্যবহার করে তবে এটি পছন্দ করা হয় কারণ সমস্ত উপাদান একই লাইব্রেরি ভাগ করে নেবে। অবশ্যই এই বিকল্পটি জড়িত সমস্ত মডিউলগুলির জন্য যেমন dll / lib / exe এর সাথে মিলিত হওয়া উচিত।

যদি আপনার নির্বাহযোগ্য তার কারও কলের চেয়ে কোনও লিব বা dll ব্যবহার করে না। পার্থক্যটি এখন খুব বেশি নয় কারণ ভাগ করার দিকটি কার্যকর হয় না।

সুতরাং আপনি / এমটি দিয়ে অ্যাপ্লিকেশনটি শুরু করতে পারেন যেহেতু অন্যথায় কোনও জোরালো কারণ নেই তবে যখন সময়টি কোনও লিবিব বা ডিএল যুক্ত করার সময় থাকে তবে আপনি এটিকে লিড / ডিএল এর সাথে / এমডিতে পরিবর্তন করতে পারেন যা সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.