LNK4098 সমাধান: ডিফল্টলিব 'এমএসভিসিআরটি'র সাথে দ্বন্দ্ব


216

এই সতর্কতা:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
  with use of other libs; use /NODEFAULTLIB:library

ভিজ্যুয়াল স্টুডিওতে মোটামুটি সাধারণ সতর্কতা। আমি এটির সঠিক কারণ এবং সঠিকভাবে (যদি আদৌ) এটি পরিচালনা করতে চাই তা বুঝতে চাই।

এটি একটি ডিবাগ বিল্ডে আসে, সংকলিত /MDd। প্রকল্পটি উইন্ডোগুলির মতো জিনিসের সাথে লিঙ্কযুক্ত Version.dllএবং pdh.dllযা নিজেরাই লিঙ্ক করে MSVCRT.dll। স্পষ্টতই, আমার এগুলির ডিবাগ সংস্করণ নেই এবং সেগুলি সংকলন করতে পারি না।

সুতরাং আমি /NODEFAULTLIB:MSVCRTলিঙ্কার কমান্ড লাইনে যুক্ত করেছি এবং এটি আসলে সতর্কতাটি সরিয়ে দিয়েছে। কিন্তু এটি আসলে কী করে? এবং কেন এটি প্রয়োজনীয়?

উত্তর:


273

উপাচার্য উপায়ে উপস্থিত সিআরটি লিঙ্ক লাইব্রেরির 4 টি সংস্করণ রয়েছে:

  • libcmt.lib: একটি রিলিজ বিল্ডের জন্য স্থিতিশীল সিআরটি লিঙ্ক গ্রন্থাগার (/ এমটি)
  • libcmtd.lib: একটি ডিবাগ বিল্ডের জন্য স্থিতিশীল সিআরটি লিঙ্ক গ্রন্থাগার (/ এমটিডি)
  • msvcrt.lib: সিআরটি (/ এমডি) -এর রিলিজ ডিএলএল সংস্করণের জন্য আমদানি পাঠাগার
  • msvcrtd.lib: সিআরটি (/ MDD) এর ডিবাগ ডিএলএল সংস্করণের জন্য আমদানি পাঠাগার

লিংকার বিকল্পগুলি, প্রকল্প + বৈশিষ্ট্য, লিংক, কমান্ড লাইন দেখুন। এই লাইব্রেরিগুলি এখানে কীভাবে উল্লেখ করা হয়নি তা নোট করুন। লিঙ্কার স্বয়ংক্রিয়ভাবে কে / এম স্যুইচটি সংকলকটি ব্যবহার করেছে এবং কোন .lib #pragma মন্তব্য নির্দেশনার মাধ্যমে লিঙ্ক করা উচিত তা নির্ধারণ করে। কিন্ডা গুরুত্বপূর্ণ, আপনি / এম বিকল্প এবং আপনার সাথে লিঙ্ক করা লাইনের মধ্যে কোনও মিল নেই তবে রানওটাইম ত্রুটিগুলি নির্ণয় করতে আপনি ভয়াবহ লিঙ্ক ত্রুটিগুলি এবং হার্ড পেতে চাইবেন।

লিঙ্কারকে এমএসভিসিআরটি.লিব এবং লিবিএমসিটি.লিবের সাথে লিঙ্ক করতে উভয়কে বলা হলে আপনি উদ্ধৃত ত্রুটি বার্তাটি দেখতে পাবেন । আপনি যদি এমডি / এমটি সংযুক্ত কোড / এমডির সাথে লিঙ্কযুক্ত কোডটি লিঙ্ক করেন তবে তা ঘটবে। সিআরটি-র কেবলমাত্র একটি সংস্করণ থাকতে পারে।

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

ঠিক আছে, এই সমস্যাটিকে সঠিক উপায়ে সমাধান করুন, আপনি যে লিঙ্কটি যুক্ত করছেন সে .obj বা .lib ফাইলটি ভুল / এম বিকল্পের সাথে সংকলন করে সন্ধান করুন। আপনার যদি কোনও ক্লু না থাকে তবে আপনি "/ এমটি" এর জন্য .obj / .lib ফাইলগুলি গ্রেপ করে এটি সন্ধান করতে পারেন

বিটিডব্লিউ: উইন্ডোজ এক্সিকিউটেবল (ভার্সন.ডিলের মতো) তাদের কাজ শেষ করার জন্য নিজস্ব সিআরটি সংস্করণ রয়েছে। এটি সি: \ উইন্ডোজ \ সিস্টেম 32 এ অবস্থিত, আপনি নিজের প্রোগ্রামগুলির জন্য এটি নির্ভরযোগ্যভাবে ব্যবহার করতে পারবেন না, এর সিআরটি শিরোনাম কোথাও উপলভ্য নয়। আপনার প্রোগ্রাম দ্বারা ব্যবহৃত সিআরটি ডিএলএলটির আলাদা নাম রয়েছে (যেমন এমএসভিসিআরটি 90.ডিএল)।


2
এই পোস্টের জন্য ধন্যবাদ, আমি এমন একটি লাইব খুঁজছিলাম যা এখনও / এমডিডি ব্যবহার করে এবং আমি অবশেষে একটি পেলাম! ধন্যবাদ, +1
ceztko

64
আমি যে লাইব্রেরিগুলি ভুল সিআরটি লাইব্রেরিতে টানছে তা ট্র্যাক করতে শিখেছি এমন কৌশলটি /verbose:libঅতিরিক্ত লিঙ্কার বিকল্পগুলিতে যুক্ত করা। এটা তোলে যাতে .lib ফাইলের মধ্যে লোড হয়, তোমার সাথে দেখা করতে যেখানে ভুল এক টানা ছিল, যার ফলে দেখায়।
obmarg

1
হান্স, এটা কতটা বিপজ্জনক? যদি আমরা এটি ঠিক করতে না পারি (আমরা আমাদের বিক্রেতার কাছ থেকে একটি সংকলিত lib পাই), তবে আমরা কী পরিণতিগুলির মুখোমুখি হতে পারি?
ইভান নিকিটিন

3
আমি @obmarg 'মন্তব্য দরকারী পাওয়া কিন্তু এখনও নিশ্চিত কিভাবে যতক্ষণ না আমি পাওয়া আউটপুট বাগাড়ম্বরপূর্ণ ব্যবহার না করার ছিল msdn.microsoft.com/en-us/library/aa267384(v=vs.60).aspx যা শাব্দিক অাউটপুটে ইচ্ছার বলেছেন লিঙ্ক সমস্যার সাথে জড়িত সমস্ত রানটাইম লাইব্রেরি কেবল আপনাকেই বলুন। তারপরও আপনাকে খুঁজে বের করতে হবে যে কোন লিঙ্ক ইনপুটটি বিরোধী রানটাইম লাইব্রেরির সাথে সংকলিত হয়েছে।
buzz3791

4
@ buzz3791 / verbose এর পরিবর্তে / verbose: lib ব্যবহার করুন। প্রদর্শিত তথ্য লাইব্রেরি অনুসন্ধান প্রক্রিয়া অন্তর্ভুক্ত এবং প্রতিটি লাইব্রেরি এবং অবজেক্টের নাম (পুরো পথ সহ) তালিকা, গ্রন্থাগার থেকে প্রতীক সমাধান করা হয়, এবং প্রতীক রেফারেন্স করে এমন বস্তুর একটি তালিকা। / ভার্বোস দ্বন্দ্বের কারণ হিসাবে খারাপ লোকটি খুঁজতে আপনার প্রয়োজনীয় সমস্ত তথ্য প্রদর্শন করতে পারে।
ইয়াং কুই

46

এর মানে নির্ভরশীল ডিএলএল এক একটি ভিন্ন সঙ্গে কম্পাইল করা হয় রান-টাইম গ্রন্থাগার

প্রকল্প -> সম্পত্তি -> সি / সি ++ -> কোড উত্পন্নকরণ -> রানটাইম লাইব্রেরি

সমস্ত লাইব্রেরি জুড়ে গিয়ে দেখুন যে সেগুলি একইভাবে সংকলিত হয়েছে।

এই লিঙ্কে এই ত্রুটি সম্পর্কে আরও:

সতর্কতা LNK4098: ডিফল্টলিব "এলআইবিসিডি" অন্যান্য লিবের ব্যবহারের সাথে দ্বন্দ্ব


এটাই ছিল ত্রুটির কারণ! বখশিশের জন্য ধন্যবাদ.
rkacch

1
কম অভিজ্ঞ প্রোগ্রামারদের জন্য এটি সেরা উত্তর।
মেলিক

32

আইএমও এই লিঙ্কে থেকে Yochai Timmer খুব ভাল এবং প্রাসঙ্গিক কিন্তু বেদনাদায়ক ছিল বই পড়া। আমি একটি সংক্ষিপ্তসার লিখেছি।

ইয়োচাই, আপনি যদি এটি কখনও পড়েন তবে দয়া করে শেষে নোটটি দেখুন।


মূল পোস্টের জন্য পড়ুন: সতর্কতা LNK4098: ডিফল্টলিব "এলআইবিসিডি" অন্যান্য লিবিসের ব্যবহারের সাথে দ্বন্দ্ব

ত্রুটি

লিঙ্ক: সতর্কতা LNK4098: ডিফল্টলিব "এলআইবিসিডি" অন্যান্য লিবসের ব্যবহারের সাথে দ্বন্দ্ব; ব্যবহার / নোডাফলটিব: গ্রন্থাগার

অর্থ

সিস্টেমের একটি অংশ একটি একক থ্রেড স্ট্যান্ডার্ড (libc) লাইব্রেরি ডিবাগ তথ্য (libcd) সহ ব্যবহার করতে সংকলিত হয়েছিল যা স্থিরভাবে সংযুক্ত

সিস্টেমের অন্য একটি অংশটি ডিবাগ তথ্য ছাড়াই মাল্টি-থ্রেড স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করতে সংকলিত হয়েছিল যা কোনও ডিএলএলে থাকে এবং গতিশীল লিঙ্ক ব্যবহার করে

কীভাবে সমাধান করবেন

  • সতর্কতা উপেক্ষা করুন, সর্বোপরি এটি কেবল একটি সতর্কতা। তবে আপনার প্রোগ্রামে এখন একই ফাংশনের একাধিক উদাহরণ রয়েছে।

  • লিঙ্কার বিকল্পটি / NODEFAULTLIB: lib ব্যবহার করুন। এটি কোনও সম্পূর্ণ সমাধান নয়, এমনকি যদি আপনি আপনার প্রোগ্রামটিকে এইভাবে সংযুক্ত করতে পারেন তবে আপনি একটি সতর্কতা চিহ্নটিকে উপেক্ষা করছেন: কোডটি বিভিন্ন পরিবেশের জন্য সংকলিত হয়েছে, অন্য কোডগুলি থাকার সময় আপনার কিছু কোড একক থ্রেডযুক্ত মডেলের জন্য সংকলিত হতে পারে other বহু-থ্রেডেড।

  • [...] আপনার সমস্ত লাইব্রেরিগুলিতে ট্রল করুন এবং তাদের সঠিক লিঙ্ক সেটিংস রয়েছে তা নিশ্চিত করুন

পরবর্তী পোস্টে যেমনটি মূল পোস্টে উল্লেখ করা হয়েছে, দুটি সাধারণ সমস্যা দেখা দিতে পারে:

  • আপনার একটি তৃতীয় পক্ষের গ্রন্থাগার রয়েছে যা আপনার আবেদনের সাথে আলাদাভাবে লিঙ্ক হয়েছে।

  • আপনার কোডে এম্বেড থাকা আপনার অন্যান্য নির্দেশাবলী রয়েছে: সাধারণত এটি এমএফসি হয়। যদি আপনার সিস্টেমের কোনও মডিউল এমএফসির বিপরীতে লিঙ্ক হয় তবে আপনার সমস্ত মডিউল অবশ্যই এমএফসি-র একই সংস্করণের বিপরীতে লিঙ্ক করতে হবে।

এই ক্ষেত্রে, আপনি সমস্যাটি বুঝতে এবং সমাধানগুলির মধ্যে সিদ্ধান্ত নেওয়ার বিষয়টি নিশ্চিত করুন।


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


7

আমি প্রতিবার ভিসি ++ এ একটি অ্যাপ্লিকেশন তৈরি করতে চাইলে এটি পেয়েছি।

প্রকল্পটিতে ডান ক্লিক করুন, তারপরে 'কনফিগারেশন বৈশিষ্ট্য | এর অধীনে সম্পত্তি নির্বাচন করুন সি / সি ++ | কোড জেনারেশন ', ডিবাগ কনফিগারেশনের জন্য "মাল্টি-থ্রেডড ডিবাগ (/ এমটিডি)" নির্বাচন করুন।

মনে রাখবেন যে এটি আপনার রিলিজ কনফিগারেশনের জন্য সেটিংস পরিবর্তন করে না - আপনাকে একই জায়গায় যেতে হবে এবং মুক্তির জন্য "মাল্টি-থ্রেডেড (/ এমটি)" নির্বাচন করতে হবে।


4

প্রকল্পটিতে ডান ক্লিক করুন, তারপরে 'কনফিগারেশন বৈশিষ্ট্য | এর অধীনে সম্পত্তি নির্বাচন করুন লিঙ্কার | ইনপুট | নির্দিষ্ট লাইব্রেরি উপেক্ষা করুন এবং msvcrtd.lib লিখুন

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