কোডটি সংকলন করতে মেকফিল এবং সিএমকে ব্যবহারের মধ্যে পার্থক্য


288

আমি সি / সি ++ তে কোড করি এবং কোডটি সংকলনের জন্য একটি (জিএনইউ) মেকফিল ব্যবহার করি। আমি সিএমকে দিয়ে একই কাজ করতে পারি এবং একটি মেকফাইল পেতে পারি। যাইহোক, কোডটি সংকলন করতে মেকফিল এবং সিএমকে ব্যবহারের মধ্যে পার্থক্য কী?


2
cmake ব্যবহার নিনজা ফাইল তৈরী করতে পারে
BЈовић

উত্তর:


403

মেক (বা বরং একটি মেকফাইল) একটি বিল্ডসিস্টেম - এটি আপনার কোডটি তৈরি করতে সংকলক এবং অন্যান্য বিল্ড সরঞ্জামগুলি চালিত করে।

সিএমকে হ'ল বিল্ডসিস্টেমগুলির জেনারেটর। এটি মেকফাইলগুলি তৈরি করতে পারে, এটি নিনজা বিল্ড ফাইল তৈরি করতে পারে, এটি কেডিএলফো বা এক্সকোড প্রকল্প তৈরি করতে পারে, এটি ভিজ্যুয়াল স্টুডিও সমাধানগুলি তৈরি করতে পারে। একই প্রারম্ভিক বিন্দু থেকে, একই সিএমকেলিস্ট.টেক্সট ফাইল। সুতরাং আপনার যদি প্ল্যাটফর্ম-স্বতন্ত্র প্রকল্প থাকে তবে সিএমকে এটিকে বিল্ডসিস্টেম-স্বতন্ত্র করারও একটি উপায় way

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

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

বিল্ডসিস্টেম জেনারেটর ব্যবহার করা আপনার প্রকল্পকে আরও ভবিষ্যত-প্রমাণ করে তোলে। এমনকি আপনি এখন কেবল জিএনইউ-মেক-আপ করলেও, পরে যদি আপনি অন্য প্ল্যাটফর্মগুলিতে প্রসারিত করার সিদ্ধান্ত নেন (তা উইন্ডোজ বা এম্বেড থাকা কিছু হোক), বা কেবল কোনও আইডিই ব্যবহার করতে চান?


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

3
আমি পড়েছি যে সিএমকে অ-পুনরাবৃত্ত মেকফাইল তৈরি করতে পারে না। এটা কি এখনও সত্য?
ম্যাক্সিম এগুরুশকিন

1
সম্পূর্ণ প্রকল্প নির্ভরতা গাছের সাথে একবার মেক করা হলে @ অঞ্জিউ অ-রিকার্সিভ হয়। যখন কোনও শীর্ষ স্তরের মেকফাইল নির্দিষ্ট ক্রমে সাব-প্রজেক্ট মেকফিলগুলিকে অনুরোধ করে তখন পুনরাবৃত্তির বিপরীতে ।
ম্যাক্সিম এগারুশকিন

3
এটি সিএমকের একটি গুরুত্বপূর্ণ দুর্বলতা - জিএনইউ মেকের এর বলি রয়েছে তবে আপনি এটি শিখতে সময় লাগলে এটি অত্যন্ত শক্তিশালী এবং বহুমুখী এবং এটি প্রচুর পরিমাণে প্ল্যাটফর্মের উপর কাজ করে। বিশ্লেষণের জন্য সম্পূর্ণ নির্ভরতা গাছ না থাকা একটি প্রধান ত্রুটি, কেবল 'পুনরাবৃত্ত মেককে ক্ষতিকারক হিসাবে বিবেচনা করা হয়' এর জন্য গুগল।
এরিক আলাপää

1
@ এরিকআলাপää আমি নিবন্ধটি বিশদভাবে পড়ব, তবে প্রথম নজরে - তারা পুনরাবৃত্ত মেক সম্পর্কে কথা বলছে বলে মনে হচ্ছে যেখানে পুনরাবৃত্তির গভীরতা ডেটা-চালিত (যেমন উত্স ডিরেক্টরিতে গভীরতার উপর নির্ভর করে)। এটি সিএমকে-র ক্ষেত্রে নয়: প্রকল্পের কাঠামো নির্বিশেষে মেক আবেদনের মোট গভীরতা সর্বদা 3। এটি কেবলমাত্র কিছু বিট একের পরিবর্তে একটি সাবম্যাকফাইলে অর্পণ করা হলেও এটি কোনওভাবেই প্রকল্প কাঠামোকে প্রতিফলিত করে না । এছাড়াও, সাবম্যাকফিলগুলি সত্যই "স্ব-অন্তর্নিহিত" নয়, সুতরাং তারা নির্ভরতা সমস্যার ওভার / আওতায় পড়ে না।
অ্যাঞ্জিউ আর তাই

39

সিএমকে "বিল্ড জেনারেটর" হওয়ার বিবৃতিটি একটি সাধারণ ভুল ধারণা ception

এটি প্রযুক্তিগতভাবে ভুল নয়; এটি কেবল এটি কীভাবে কাজ করে তা বর্ণনা করে তবে এটি কী করে তা নয়।

প্রশ্নের প্রসঙ্গে তারা একই কাজ করে: একগুচ্ছ সি / সি ++ ফাইল নিয়ে সেগুলি বাইনারিতে পরিণত করে।

তাহলে, আসল পার্থক্য কী?

  • সিএমকেক অনেক বেশি উচ্চ-স্তরের। এটি সি ++ সংকলন করার জন্য তৈরি করা হয়েছে, যার জন্য আপনি বিল্ড কোড কম লিখে থাকেন তবে সাধারণ উদ্দেশ্যে তৈরির জন্যও এটি ব্যবহার করা যেতে পারে। makeকিছু অন্তর্নির্মিত সি / সি ++ নিয়মগুলি রয়েছে তবে সেগুলি বেশিরভাগই অকেজো।

  • CMakeএকটি দুটি পদক্ষেপে বিল্ড করে এতে একটি নিম্ন স্তরের বিল্ড স্ক্রিপ্ট উত্পন্ন ninjaবা makeবা অন্যান্য অনেক জেনারেটর, এবং তারপরে আপনি এটি চালানোর জন্য। সমস্ত শেল স্ক্রিপ্ট টুকরোগুলি যা সাধারণত পাইল Makefileথাকে কেবল প্রজন্মের পর্যায়ে কার্যকর করা হয়। সুতরাং, CMakeবিল্ডিং দ্রুততরতার অর্ডার হতে পারে।

  • ব্যাকরণটি মেকিংয়ের চেয়েCMake বাহ্যিক সরঞ্জামগুলির পক্ষে সমর্থন করা অনেক সহজ ।

  • একবার makeএকটি শৈল্পিক তৈরি করে, এটি কীভাবে তৈরি হয়েছিল তা ভুলে যায়। এটি কোন উত্স থেকে নির্মিত হয়েছিল, কোন সংকলক পতাকাগুলি? CMakeএটি ট্র্যাক করে, makeএটি আপনার উপর ছেড়ে দেয়। পূর্ববর্তী সংস্করণ থেকে যদি কোনও গ্রন্থাগার উত্স অপসারণ করা হয় Makefile, makeতবে এটি পুনর্নির্মাণ করবে না।

  • আধুনিক CMake(সংস্করণ 3. কিছু দিয়ে শুরু করে) "লক্ষ্যগুলি" এর মধ্যে নির্ভরতার শর্তে কাজ করে। একটি লক্ষ্য এখনও একটি একক আউটপুট ফাইল (দুঃখের সাথে), তবে ট্রানসিটিভ ("সার্বজনীন" / "ইন্টারফেস" সিএমকেট পদে) নির্ভরতা থাকতে পারে। এই ট্রানজিটিভ নির্ভরতা নির্ভর প্যাকেজগুলি থেকে প্রকাশ বা গোপন করা যেতে পারে। CMakeআপনার জন্য ডিরেক্টরি পরিচালনা করবে। এর সাথে make, আপনি একটি ফাইল-ইন-ফাইল এবং পরিচালনা-ডিরেক্টরি-দ্বারা-হাত স্তরে আটকে আছেন।

makeশেষ দুটি ফাঁকগুলি coverাকতে ফ্ল্যাগ ফাইলগুলি ব্যবহার করে আপনি কিছু কোড আপ করতে পারেন তবে আপনি নিজেরাই। makeএতে একটি টিউরিং সম্পূর্ণ ভাষা থাকে (এমনকি দুটি, কখনও কখনও তিনটি গিলি গণনা করা হয় ) এবং সেগুলি সব ভয়াবহ।

সৎ হবে, এটা কি CMakeএবং make: তাদের ভাষায় চমত্কার ভয়ঙ্কর রয়েছে - কমন আছে

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

দিয়ে শুরু.

কিন্তু CMakeআপনি কোড অনেক কম লাইন লিখুন।


1
কিছু ভাল তথ্য এখানে, তবে একটি মন্তব্য সম্পূর্ণ ভুল: cmake একটি LIST টাইপ আছে যেহেতু যথাযথ LIST ফাংশন রয়েছে যা প্রচুর বিল্ড-সিস্টেমের কাজের জন্য গুরুত্বপূর্ণ, কিছুটা পার্থক্য: cmake.org/cmake/help/git-master/command / list.html
সমাধান

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