সিএমকে কীভাবে ব্যবহার করা হয়? [বন্ধ]


100

শিক্ষানবিস হিসাবে সিএমকে সম্পর্কে কোনও দরকারী তথ্য পাওয়া কুখ্যাতভাবে is এখনও অবধি, আমি কিছু খুব বেসিক প্রকল্প বা অন্য কোনওটি কীভাবে সেটআপ করতে পারি তার কয়েকটি টিউটোরিয়াল দেখেছি। যাইহোক, এর মধ্যে কোনও কিছুই তাদের মধ্যে প্রদর্শিত কোনও কিছুর পিছনে যুক্তি ব্যাখ্যা করে না, সবসময় অনেকগুলি গর্ত পূরণ করতে দেয়।

সিএমকেলিস্টে সিএমকে ডাকার অর্থ কী ? এটি প্রতি বিল্ড ট্রি হিসাবে একবার ডাকার কথা বা কী? যদি তারা সকলেই একই উত্স থেকে একই সিএমকেলিস্ট.টিএসটি ফাইল ব্যবহার করে তবে প্রতিটি বিল্ডের জন্য আমি কীভাবে আলাদা সেটিংস ব্যবহার করব? কেন প্রতিটি উপ-ডিরেক্টরিটির নিজস্ব সিএমকেলিস্ট ফাইল দরকার? প্রকল্পের মূলে থাকা সিএমকেলিস্ট.টেক্সট ছাড়া সিএমকে ব্যবহার করা কি বোধগম্য হবে? যদি তা হয় তবে কোন ক্ষেত্রে? সমস্ত উত্সের মূলের সিএমকেলিস্ট ফাইলে এটি করা বনাম তাদের নিজস্ব উপ-ডিরেক্টরিতে সিএমকেলিস্ট ফাইল থেকে এক্সিকিউটেবল বা লাইব্রেরি কীভাবে তৈরি করবেন তা নির্দিষ্ট করার মধ্যে পার্থক্য কী? আমি কি -Gসিলেককে ফোন করার সময় বিকল্পটি পরিবর্তন করে, Eclipse এর জন্য এবং আরেকটি ভিজ্যুয়াল স্টুডিওর জন্য একটি প্রকল্প তৈরি করতে পারি ? এটি কি এটি ব্যবহার হয়?

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

আমার মতো সিএমকে নতুনকে জিজ্ঞাসা করা অনেকগুলি প্রশ্ন রয়েছে যা এটিকে স্পষ্টভাবে জিজ্ঞাসা করে না, তবে এটি সত্যই স্পষ্ট করে দেয় যে, নবীন হিসাবে, কীভাবে সিএমকে মোকাবেলা করতে হবে বা কী তৈরি করা যায় সে সম্পর্কে আমাদের ধারণা নেই।


8
এর পরিবর্তে আপনার কোনও ব্লগ পোস্ট লেখা উচিত।
স্টিভায়ার

4
আমি নিকট-ভোটের "খুব বিস্তৃত" প্রলুব্ধ করছি ... এটি স্ট্যাকওভারফ্লোয়ের জন্য ভাল ফিটের চেয়ে সিএমকে-র একটি ব্যক্তিগত প্রবন্ধের মতো বেশি বোধ করে। কেন আপনি এই সমস্ত প্রশ্ন পৃথক প্রশ্নে রাখেন নি? এবং আপনার প্রশ্ন + উত্তর অন্য অনেকের থেকে কীভাবে আলাদা, যেমন: স্ট্যাকওভারফ্লো . com / q/ 20884380 / 417197 , স্ট্যাকওভারফ্লো . com / q / 4745996/ 417197 , স্ট্যাকওভারফ্লো . com / q/ 4506193 / 417197 ?
আন্দ্রে

14
@ আন্ড্রে কেন এই প্রশ্ন: আমি সিএমকে বোঝার চেষ্টা করে এক সপ্তাহ কাটিয়েছি এবং আমার পাওয়া কোনও টিউটোরিয়াল সম্পূর্ণ হয়নি। আপনি যে লিঙ্কগুলি চিহ্নিত করেছেন সেগুলি ভাল, তবে যে কেউ সিএমকে খুঁজে পেয়েছিল কারণ তাদের ভিতরে সিএমকেলিস্টগুলির একটি গোছা ফেলে একটি প্রকল্প পেয়েছিল তারা সিএমকে কীভাবে কাজ করে সে বিষয়ে তারা খুব বেশি আলোকপাত করেন না। আমি সমস্ত সততার সাথে একটি উত্তর লেখার চেষ্টা করেছি যে আমি যখন সিএমকে শেখার চেষ্টা শুরু করি তখন আমি সময় মতো নিজেকে আবার পাঠাতে পারতাম। এবং উপ-প্রশ্নগুলি বোঝাতে বোঝানো হচ্ছে যে আমি আসলে এটি জিজ্ঞাসা করার চেষ্টা করছি যে আমার সন্দেহ হওয়া উচিত না যাতে এটি আমার জানা উচিত। সঠিক প্রশ্ন জিজ্ঞাসা হার্ড।
লীনাডি_নাটিপ্যাক

4
কোনও উত্তর নয়, তবে আমি আপনাকে jaws.rootdirectory.deদেখার জন্য আমন্ত্রণ জানিয়েছি । যদিও সিএমকে ডুকমেন্টেশন (এবং স্বীকৃত উত্তর ...) আপনাকে কী করতে পারে তার অনেকগুলি কামড়ের আকারের স্নিপেট দেখায় , আমি জুড়ে মন্তব্য সহ একটি ( কোনওভাবেই "সম্পূর্ণ" বা "নিখুঁত") বেসিক সেটআপ লিখেছিলাম, যে আইএমএইচও আপনাকে সিএমকে (এবং সিস্টেস্ট এবং সিপ্যাক এবং সিডিএশ ...) কী করতে পারে তা প্রদর্শন করে। এটি বাক্সের বাইরে তৈরি করে এবং আপনি আপনার প্রকল্পের প্রয়োজনের সাথে এটি সহজেই মানিয়ে নিতে / প্রসারিত করতে পারেন।
দেবসোলার

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

উত্তর:


145

সিএমকে কীসের জন্য?

উইকিপিডিয়া অনুসারে:

সিএমকে হ'ল [...] একটি সংকলক-স্বাধীন পদ্ধতি ব্যবহার করে সফ্টওয়্যার তৈরির প্রক্রিয়া পরিচালনার জন্য সফটওয়্যার। এটি একাধিক লাইব্রেরির উপর নির্ভরশীল ডিরেক্টরি শ্রেণিবিন্যাস এবং অ্যাপ্লিকেশনগুলিকে সমর্থন করার জন্য ডিজাইন করা হয়েছে। এটি মেক, অ্যাপলের এক্সকোড এবং মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিওর মতো দেশীয় বিল্ড পরিবেশের সাথে একত্রে ব্যবহৃত হয়।

সিএমকে দিয়ে, আপনার আর আপনার সংকলক / বিল্ড এনভায়রনমেন্টের জন্য আলাদা আলাদা সেটিংস বজায় রাখতে হবে না। আপনার একটি কনফিগারেশন রয়েছে এবং এটি অনেক পরিবেশের জন্য কাজ করে।

সিএমকে কোনও ফাইল পরিবর্তন না করে একই ফাইলগুলি থেকে একটি মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সমাধান, একটি এক্সপ্লিজ প্রকল্প বা একটি মেকফাইল ম্যাজ তৈরি করতে পারে।

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

যদি এটি সঠিকভাবে সেট আপ করা হয়, আপনি তারপরে আপনার পছন্দসই "নেটিভ বিল্ড এনভায়রনমেন্ট" এর কাজ করার জন্য প্রয়োজনীয় সমস্ত ফাইল তৈরি করতে আপনি সিএমকে ব্যবহার করুন। লিনাক্সে, ডিফল্টরূপে, এর অর্থ মেকফাইলস। আপনি একবার সিএমকে চালানোর পরে, এটি নিজস্ব ব্যবহারের জন্য কিছু Makefileগুলির জন্য আরও কিছু ফাইল তৈরি করবে । তারপরে আপনাকে যা করতে হবে তা হ'ল প্রতিবার আপনার কোড সম্পাদনা করার পরে রুট ফোল্ডার থেকে কনসোলে "মেক" টাইপ করুন এবং বাম, একটি সংকলিত এবং সংযুক্ত এক্সিকিউটেবল তৈরি করা হবে।

সিএমকে কীভাবে কাজ করে? এটার কাজ কি?

এখানে একটি উদাহরণ প্রকল্প সেটআপ যা আমি ব্যবহার করব:

simple/
  CMakeLists.txt
  src/
    tutorial.cxx
    CMakeLists.txt
  lib/
    TestLib.cxx
    TestLib.h
    CMakeLists.txt
  build/

প্রতিটি ফাইলের বিষয়বস্তুগুলি পরে দেখানো হয় এবং আলোচনা করা হয়।

সিএমকে আপনার প্রকল্পের মূল অনুসারে আপনার প্রকল্পটি সেট আপ CMakeLists.txtকরে cmakeএবং কনসোল থেকে আপনি যে কোনও ডিরেক্টরিতে এক্সিকিউট করেছেন in আপনার প্রকল্পের মূল নয় এমন ফোল্ডার থেকে এটি করার ফলে আউট-অফ-সোর্স বিল্ড বলা হয়, যার অর্থ সংকলনের সময় তৈরি করা ফাইল (filesজেক্ট ফাইল, লিব ফাইল, এক্সিকিউটেবল, আপনি জানেন) উক্ত ফোল্ডারে স্থাপন করা হবে , প্রকৃত কোড থেকে পৃথক রাখা। এটি বিশৃঙ্খলা হ্রাস করতে সহায়তা করে এবং অন্যান্য কারণেও পছন্দনীয়, যা আমি আলোচনা করব না।

cmakeরুট ব্যতীত অন্য কোনওকে এক্সিকিউট করলে কী হয় আমি জানি না CMakeLists.txt

এই উদাহরণে, যেহেতু আমি এটি সমস্ত build/ফোল্ডারের ভিতরে রাখতে চাই তাই প্রথমে আমাকে সেখানে নেভিগেট করতে হবে, তারপরে সিএমকেক ডিরেক্টরিটি পাস করুন যেখানে মূলটি CMakeLists.txtথাকে।

cd build
cmake ..

ডিফল্টরূপে, মেকফাইলগুলি ব্যবহার করে সবকিছু যেমন সেট করে ফেলেছে তা আমি বলেছি। বিল্ড ফোল্ডারটি এখন দেখতে কেমন হওয়া উচিত তা এখানে:

simple/build/
  CMakeCache.txt
  cmake_install.cmake
  Makefile
  CMakeFiles/
    (...)
  src/
    CMakeFiles/
      (...)
    cmake_install.cmake
    Makefile
  lib/
    CMakeFiles/
      (...)
    cmake_install.cmake
    Makefile

এই সব ফাইল কি? আপনার কেবলমাত্র চিন্তার বিষয় হ'ল মেকফিল এবং প্রকল্প ফোল্ডার

src/এবং lib/ফোল্ডারগুলি লক্ষ্য করুন । এগুলি তৈরি করা হয়েছে কারণ simple/CMakeLists.txtকমান্ডটি ব্যবহার করে তাদের পয়েন্ট করে add_subdirectory(<folder>)। এই কমান্ডটি সিএমকে অন্য CMakeLists.txtফাইলের জন্য সেই ফোল্ডারটি সন্ধান করতে এবং সেই স্ক্রিপ্টটি সম্পাদন করতে বলে , সুতরাং প্রতিটি উপ-ডিরেক্টরিটি এইভাবে যুক্ত হওয়াতে অবশ্যই একটি CMakeLists.txtফাইল থাকা উচিত । এই প্রকল্পে, simple/src/CMakeLists.txtবাস্তব নির্বাহযোগ্য simple/lib/CMakeLists.txtকীভাবে তৈরি করবেন এবং লাইব্রেরিটি কীভাবে তৈরি করবেন তা বর্ণনা করে। CMakeLists.txtবর্ণিত প্রতিটি লক্ষ্য বিল্ট ট্রি এর মধ্যে তার উপ-ডিরেক্টরিতে ডিফল্টরূপে স্থাপন করা হবে। সুতরাং, একটি দ্রুত পরে

make

কনসোল থেকে সম্পন্ন build/, কিছু ফাইল যুক্ত করা হয়েছে:

simple/build/
  (...)
  lib/
    libTestLib.a
    (...)
  src/
    Tutorial
    (...)

প্রকল্পটি নির্মিত, এবং এক্সিকিউটেবল কার্যকর করার জন্য প্রস্তুত। আপনি যদি একটি নির্দিষ্ট ফোল্ডারে এক্সিকিউটেবলগুলি রাখতে চান তবে আপনি কী করবেন? উপযুক্ত সিএমকে ভেরিয়েবল সেট করুন, বা একটি নির্দিষ্ট টার্গেটের বৈশিষ্ট্য পরিবর্তন করুন । পরে সিএমকে পরিবর্তনশীলগুলিতে আরও।

আমি কীভাবে সিএমকে বলব যে আমার প্রকল্পটি কীভাবে তৈরি করা যায়?

উত্স ডিরেক্টরিতে প্রতিটি ফাইলের বিষয়বস্তু এখানে ব্যাখ্যা করা আছে:

simple/CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

project(Tutorial)

# Add all subdirectories in this project
add_subdirectory(lib)
add_subdirectory(src)

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

আপনার প্রকল্পের নামটি পরে ব্যবহার করা যেতে পারে এবং একই সিএমকে ফাইল থেকে আপনি একাধিক প্রকল্প পরিচালনা করতে পারবেন তার প্রতি ইঙ্গিত। যদিও আমি তাতে খোঁজ করব না।

পূর্বে উল্লিখিত হিসাবে, add_subdirectory()প্রকল্পে একটি ফোল্ডার যুক্ত করেছে, যার অর্থ সিএমকে আশা করে যে এটি এর CMakeLists.txtমধ্যে রয়েছে যা এটি পরে চালিয়ে যাওয়ার আগে চলবে। যাইহোক, যদি আপনি সিএমকে ফাংশনটি সংজ্ঞায়িত করে থাকেন তবে আপনি এটি CMakeLists.txtউপ-ডিরেক্টরিতে অন্য গুলি থেকে ব্যবহার করতে পারেন , তবে আপনি এটি ব্যবহারের আগে এটি সংজ্ঞায়িত করতে হবে add_subdirectory()বা এটি এটি খুঁজে পাবে না। সিএমকে গ্রন্থাগারগুলি সম্পর্কে বুদ্ধিমান, তবে এটি সম্ভবত আপনি যখন এই ধরণের সমস্যায় পড়বেন তবেই সম্ভবত এটি সম্ভব।

simple/lib/CMakeLists.txt:

add_library(TestLib TestLib.cxx)

আপনার নিজস্ব লাইব্রেরি তৈরি করতে, আপনি এটিকে একটি নাম দিন এবং তারপরে এটি নির্মিত সমস্ত ফাইল তালিকাভুক্ত করুন। সোজা এটি foo.cxxসঙ্কলিত করার জন্য যদি অন্য কোনও ফাইলের প্রয়োজন হয় তবে আপনি তার পরিবর্তে লিখতে পারেন add_library(TestLib TestLib.cxx foo.cxx)। উদাহরণস্বরূপ এটি অন্যান্য ডিরেক্টরিতে ফাইলগুলির জন্যও কাজ করে add_library(TestLib TestLib.cxx ${CMAKE_SOURCE_DIR}/foo.cxx)। CMAKE_SOURCE_DIR পরিবর্তনশীল পরে আরও later

আপনি এটির সাথে আর একটি জিনিস করতে পারেন তা নির্দিষ্ট করে আপনি একটি ভাগ করা লাইব্রেরি চান want উদাহরণ: add_library(TestLib SHARED TestLib.cxx)। ভয় পাবেন না, এখান থেকেই সিএমকে আপনার জীবনকে আরও সহজ করে তোলা শুরু করে। এটি ভাগ করা হোক বা না হোক, এখন এইভাবে তৈরি লাইব্রেরিটি ব্যবহার করার জন্য আপনার যা যা করা দরকার তা হ'ল এখানে আপনি নাম দিয়েছেন। এই লাইব্রেরির নাম এখন টেস্টলিব, এবং আপনি প্রকল্পের যে কোনও জায়গা থেকে এটি উল্লেখ করতে পারেন । সিএমকে এটি খুঁজে পাবেন।

নির্ভরতা তালিকাভুক্ত করার আরও ভাল উপায় আছে কি? নিশ্চিতভাবে হ্যাঁ । এ সম্পর্কে আরও জানতে নীচে চেক করুন।

simple/lib/TestLib.cxx:

#include <stdio.h>

void test() {
  printf("testing...\n");
}

simple/lib/TestLib.h:

#ifndef TestLib
#define TestLib

void test();

#endif

simple/src/CMakeLists.txt:

# Name the executable and all resources it depends on directly
add_executable(Tutorial tutorial.cxx)

# Link to needed libraries
target_link_libraries(Tutorial TestLib)

# Tell CMake where to look for the .h files
target_include_directories(Tutorial PUBLIC ${CMAKE_SOURCE_DIR}/lib)

কমান্ডটি add_executable()ঠিক একইভাবে কাজ করে add_library(), অবশ্যই, এটি পরিবর্তে একটি এক্সিকিউটেবল তৈরি করে। এই নির্বাহযোগ্যটিকে এখন পছন্দ মতো জিনিসের জন্য লক্ষ্য হিসাবে উল্লেখ করা যেতে পারে target_link_libraries()। যেহেতু টিউটোরিয়াল।

একইভাবে, কোন জ কোনো উৎস #included ফাইল add_executable()যে না হিসাবে উৎস একরকম যোগ করা আছে একই ডিরেক্টরির মধ্যে। যদি target_include_directories()কমান্ডের জন্য না হয়, lib/TestLib.hটিউটোরিয়াল সংকলন করার সময় পাওয়া যায় না, সুতরাং lib/# ফটোগুলি অনুসন্ধান করার জন্য অন্তর্ভুক্ত ডিরেক্টরিগুলিতে পুরো ফোল্ডারটি যুক্ত করা হয়। আপনি কমান্ডটিও দেখতে পাবেন include_directories()যা একই ধরণের কাজ করে, কেবলমাত্র এটি নির্ধারণের জন্য আপনার লক্ষ্য প্রয়োজন না যেহেতু এটি সমস্ত এক্সিকিউটেবলের জন্য একে একে বিশ্বব্যাপী নির্ধারণ করে। আবার, আমি পরে CMAKE_SOURCE_DIR ব্যাখ্যা করব।

simple/src/tutorial.cxx:

#include <stdio.h>
#include "TestLib.h"
int main (int argc, char *argv[])
{
  test();
  fprintf(stdout, "Main\n");
  return 0;
}

"টেস্টলিব.হ." ফাইলটি কীভাবে অন্তর্ভুক্ত রয়েছে তা লক্ষ্য করুন। পুরো পথটি অন্তর্ভুক্ত করার দরকার নেই: সিএমকে পর্দার পিছনে সমস্ত বিষয়টির জন্য ধন্যবাদ জানায় target_include_directories()

টেকনিক্যালি ভালো বলতে, একটি সহজ উৎস গাছে আপনি পারেন ছাড়া কি CMakeLists.txtঅধীনে গুলি lib/এবং src/এবং মাত্র ভালো কিছু যোগ করার add_executable(Tutorial src/tutorial.cxx)জন্য simple/CMakeLists.txt। এটি আপনার এবং আপনার প্রকল্পের প্রয়োজনের উপর নির্ভর করে।

সিএমকে সঠিকভাবে ব্যবহার করতে আমার আর কী জানতে হবে?

(আপনার বোঝার সাথে সম্পর্কিত এ কেএ বিষয়গুলি)

প্যাকেজগুলি সন্ধান এবং ব্যবহার করা : এই প্রশ্নের উত্তরটি এটি আমার চেয়ে আরও ভাল ব্যাখ্যা করেছে।

নিয়ন্ত্রণ প্রবাহ ইত্যাদি ব্যবহার করে ভেরিয়েবল এবং ফাংশন ডিক্লেয়ারিং : এই টিউটোরিয়ালটি পরীক্ষা করে দেখুন যা সিএমকে কী অফার করবে তার মূল বিষয়গুলি এবং সেইসাথে সাধারণভাবে একটি ভাল পরিচিতি হিসাবে ব্যাখ্যা করে।

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

আপনি বিল্ড ট্রি পুনর্নির্মাণ না করে কিছু পরিবর্তনশীল সম্পাদনা করতে চাইতে পারেন। এর জন্য সিসমেক ব্যবহার করুন (এটি CMakeCache.txtফাইলটি সম্পাদনা করে )। cপরিবর্তনগুলি সম্পন্ন হওয়ার পরে অ্যানফিগারে স্মরণ করুন এবং তারপরে gআপডেট কনফিগারেশনের মাধ্যমে মেকফিলগুলি এনিরেট করুন।

ভেরিয়েবল ব্যবহার সম্পর্কে শিখতে আগের রেফারেন্সযুক্ত টিউটোরিয়ালটি পড়ুন তবে দীর্ঘ গল্পের সংক্ষিপ্ত: set(<variable name> value)পরিবর্তনশীল তৈরি করতে বা তৈরি করতে। ${<variable name>}এটি ব্যবহার করতে।

  • CMAKE_SOURCE_DIR: উত্সের মূল ডিরেক্টরি। পূর্ববর্তী উদাহরণে, এটি সর্বদা সমান/simple
  • CMAKE_BINARY_DIR: বিল্ডের মূল ডিরেক্টরি। পূর্ববর্তী উদাহরণে, এটি সমান simple/build/, তবে আপনি যদি cmake simple/কোনও ফোল্ডার থেকে দৌড়ে থাকেন তবে সেই বিল্ড ট্রিতে foo/bar/etc/সমস্ত উল্লেখ CMAKE_BINARY_DIRহয়ে যাবে /foo/bar/etc
  • CMAKE_CURRENT_SOURCE_DIR: যে ডিরেক্টরিটিতে বর্তমান CMakeLists.txtরয়েছে This এর অর্থ এটি জুড়ে পরিবর্তিত হয়: simple/CMakeLists.txtফলন /simpleথেকে এটি মুদ্রণ করা, এবং simple/src/CMakeLists.txtফলন থেকে মুদ্রণ করা /simple/src
  • CMAKE_CURRENT_BINARY_DIR: আপনি ধারণা পাবেন। এই পাথটি কেবল বিল্ডটি থাকা ফোল্ডারে নয়, বর্তমান CMakeLists.txtস্ক্রিপ্টের অবস্থানের উপরও নির্ভর করবে ।

এগুলি কেন গুরুত্বপূর্ণ? উত্স ফাইলগুলি অবশ্যই বিল্ড ট্রিতে থাকবে না not আপনি ভালো কিছু চেষ্টা করুন target_include_directories(Tutorial PUBLIC ../lib)পূর্ববর্তী উদাহরণে, সেই পথ build ট্রি, এটা লেখা কেমন হবে বলতে হয় যে আপেক্ষিক হতে হবে ${CMAKE_BINARY_DIR}/lib, যা ভিতরে দেখবে simple/build/lib/। সেখানে কোনও .h ফাইল নেই; সর্বাধিক আপনি পাবেন libTestLib.a${CMAKE_SOURCE_DIR}/libপরিবর্তে আপনি চান ।

  • CMAKE_CXX_FLAGS: এই ক্ষেত্রে সি ++ সংকলক, সংকলকটিতে ফ্ল্যাগগুলি প্রেরণ করবে। এছাড়াও লক্ষণীয় বিষয় হ'ল CMAKE_CXX_FLAGS_DEBUGএটি যদি CMAKE_BUILD_TYPEDEBUG তে সেট করা হয় তবে পরিবর্তে ব্যবহৃত হবে । এ জাতীয় আরও কিছু আছে; খুঁজে বার করো CMake উইকি
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY: সিএমকে বলুন যখন নির্মিত হবে তখন সমস্ত এক্সিকিউটেবলকে কোথায় রাখা হবে। এটি একটি বিশ্বব্যাপী সেটিং। উদাহরণস্বরূপ, আপনি এটিকে সেট করতে bin/এবং সবকিছু খুব সুন্দরভাবে সেখানে স্থাপন করতে পারেন। EXECUTABLE_OUTPUT_PATHআপনি যদি এতে হোঁচট খেয়ে থাকেন তবে একই রকম, তবে অবহেলিত।
  • CMAKE_LIBRARY_OUTPUT_DIRECTORY: একইভাবে, সমস্ত লাইব্রেরির ফাইলগুলি কোথায় রাখা উচিত তা সিএমকে জানানোর জন্য একটি বিশ্বব্যাপী সেটিংস।

লক্ষ্য বৈশিষ্ট্য : আপনি কেবলমাত্র একটি লক্ষ্যকে প্রভাবিত করে এমন বৈশিষ্ট্যগুলি সেট করতে পারেন, এটি নির্বাহযোগ্য বা লাইব্রেরি (বা একটি সংরক্ষণাগার ... আপনি ধারণাটি পান)। এটি কীভাবে ব্যবহার করতে হয় তার একটি ভাল উদাহরণ এখানেset_target_properties()

কোনও লক্ষ্যে স্বয়ংক্রিয়ভাবে উত্স যুক্ত করার কোনও সহজ উপায় আছে? একই ভেরিয়েবলের অধীনে প্রদত্ত ডিরেক্টরিতে সমস্ত কিছু তালিকাভুক্ত করতে GLOB ব্যবহার করুন । উদাহরণ বাক্য গঠন FILE(GLOB <variable name> <directory>/*.cxx)

আপনি বিভিন্ন বিল্ড প্রকার নির্দিষ্ট করতে পারেন? হ্যাঁ, যদিও এটি কীভাবে কাজ করে বা এর সীমাবদ্ধতা সম্পর্কে আমি নিশ্চিত নই। এটি সম্ভবত / তত্পর হলে কিছু প্রয়োজন হয়, তবে সিএমকে উদাহরণস্বরূপ, ডিফল্টের মতো কিছু কনফিগার না করে কিছু প্রাথমিক সমর্থন সরবরাহ করে CMAKE_CXX_FLAGS_DEBUG। আপনি হয় CMakeLists.txtফাইলের মধ্যে থেকে আপনার বিল্ড প্রকারটি সেট করতে পারেন set(CMAKE_BUILD_TYPE <type>)বা উপযুক্ত পতাকা সহ কনসোল থেকে সিএমকে কল করে, উদাহরণস্বরূপ cmake -DCMAKE_BUILD_TYPE=Debug

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

আপনার কোডে সিএমকে থেকে ভেরিয়েবলগুলি ব্যবহার করুন : এখানে একটি দ্রুত এবং নোংরা উদাহরণ ( অন্য কয়েকটি টিউটোরিয়াল থেকে অভিযোজিত ):

simple/CMakeLists.txt:

project (Tutorial)

# Setting variables
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 1)

# Configure_file(<input> <output>)
# Copies a file <input> to file <output> and substitutes variable values referenced in the file content.
# So you can pass some CMake variables to the source code (in this case version numbers)
configure_file (
  "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
  "${PROJECT_SOURCE_DIR}/src/TutorialConfig.h"
)

simple/TutorialConfig.h.in:

// Configured options and settings
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

সিএমকে উত্পাদিত ফলাফল ফাইল simple/src/TutorialConfig.h:

// Configured options and settings
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 1

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

অন্য সব কিছুর জন্য, স্ট্যাক ওভারফ্লো নির্দিষ্ট প্রশ্ন এবং সংক্ষিপ্ত উত্তরগুলির সাথে ঝাঁকুনি দিচ্ছে, যা অবিচ্ছিন্ন ছাড়া সবার জন্য দুর্দান্ত।


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

7
এই আশ্চর্যজনক কাজের জন্য ধন্যবাদ। আশা করি এটি আরও বেশি ভোট পাবে! :)
এলইটিএস

4
পরিবর্তে সেখানে সংক্ষিপ্ত বিন্দু: সিএমকে দিয়ে, আপনাকে আর আপনার সংকলক / বিল্ড পরিবেশের সাথে সুনির্দিষ্ট পৃথক সেটিংস বজায় রাখতে হবে না। আপনার একটি কনফিগারেশন রয়েছে এবং এটি (বিভিন্ন সংস্করণ) ভিজ্যুয়াল স্টুডিও, কোড ব্লক, সাধারণ ইউনিক্স মেকফিলস এবং অন্যান্য অনেক পরিবেশের জন্য কাজ করে। সে কারণেই আমি প্রথম স্থানে সিএমকে দেখছিলাম: অটোকনফ, এমএসভিসি 2005/32 বিট, এবং এমএসভিসি 2010/64 বিট কনফিগারেশনগুলিকে সিঙ্কে রাখাই একটি বড় ব্যথা হয়ে দাঁড়িয়েছে। এবং একবার এটির হ্যাঙ্গ পেয়ে গেলে আমি আরও অনেকগুলি জিনিস যেমন ডক জেনারেশন, টেস্টিং, প্যাকেজিং ইত্যাদি যুক্ত করেছি, সেগুলি ক্রস প্ল্যাটফর্মের উপায়ে।
দেবসোলার

4
পছন্দ করুন আমি উইকিপিডিয়া এর চেয়ে লাইনটি বেশি পছন্দ করি তাই আপনি যদি কিছু মনে না করেন তবে আমি উত্তরটিতে এটি যুক্ত করব। সিএমকে কীভাবে সঠিকভাবে ব্যবহার করা যায় সে সম্পর্কে আমি কোনওভাবেই ফিট করব না। এটি কেবল কী চলছে তা বলতে সক্ষম হওয়ায় এটি আরও বেশি।
লীনাডি_নাটিপ্যাক

4
@ রিচিএইচ এই উদাহরণ অনুসরণ করে আপনি প্রথমে মেকফিলগুলি ব্যবহারের জন্য সিএমকে কনফিগার করেছেন, তারপরে আপনি সিএমকেকে আপনার প্রকল্পটি তৈরি করার জন্য প্রয়োজনীয় ফাইলগুলি তৈরি করতে ব্যবহার করেন এবং অবশেষে আপনি সিএমকে নিয়ে চিন্তাভাবনা বন্ধ করে দেন কারণ এখানে কাজটি সম্পন্ন হয়েছে। সুতরাং আপনি মেকফিল সম্পর্কে "উদ্বেগ" এই অর্থে যে এখন থেকে আপনাকে makeআপনার প্রকল্পটি ভাল করার জন্য ব্যাশ ব্যবহার করতে হবে।
লীনাডি_নাটিপ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.