সিএমকে কীসের জন্য?
উইকিপিডিয়া অনুসারে:
সিএমকে হ'ল [...] একটি সংকলক-স্বাধীন পদ্ধতি ব্যবহার করে সফ্টওয়্যার তৈরির প্রক্রিয়া পরিচালনার জন্য সফটওয়্যার। এটি একাধিক লাইব্রেরির উপর নির্ভরশীল ডিরেক্টরি শ্রেণিবিন্যাস এবং অ্যাপ্লিকেশনগুলিকে সমর্থন করার জন্য ডিজাইন করা হয়েছে। এটি মেক, অ্যাপলের এক্সকোড এবং মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিওর মতো দেশীয় বিল্ড পরিবেশের সাথে একত্রে ব্যবহৃত হয়।
সিএমকে দিয়ে, আপনার আর আপনার সংকলক / বিল্ড এনভায়রনমেন্টের জন্য আলাদা আলাদা সেটিংস বজায় রাখতে হবে না। আপনার একটি কনফিগারেশন রয়েছে এবং এটি অনেক পরিবেশের জন্য কাজ করে।
সিএমকে কোনও ফাইল পরিবর্তন না করে একই ফাইলগুলি থেকে একটি মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সমাধান, একটি এক্সপ্লিজ প্রকল্প বা একটি মেকফাইল ম্যাজ তৈরি করতে পারে।
কোডগুলিতে একগুচ্ছ ডিরেক্টরি দেওয়া, সিএমেক সমস্ত নির্ভরতা পরিচালনা করে, অর্ডার এবং অন্যান্য কাজগুলি তৈরি করে যা আপনার প্রকল্পটি সংকলিত হওয়ার আগে তৈরি করতে পারে। এটি আসলে কিছু সংকলন করে না। সিএমকে ব্যবহার করার জন্য আপনাকে অবশ্যই এটি অবশ্যই বলতে হবে (সিএমকেলিস্ট.টেক্সট নামে পরিচিত কনফিগারেশন ফাইলগুলি ব্যবহার করে) আপনাকে কী এক্সিকিউটেবলগুলি সংকলন করতে হবে, তারা কোন লাইব্রেরিগুলির সাথে লিঙ্ক করেছে, আপনার প্রকল্পে কোন ডিরেক্টরি রয়েছে এবং এর ভিতরে কী রয়েছে সেগুলি পাশাপাশি পতাকাগুলির মতো কোনও বিবরণ রয়েছে বা আপনার অন্য যে কোনও কিছু প্রয়োজন (সিএমকেক বেশ শক্তিশালী)।
যদি এটি সঠিকভাবে সেট আপ করা হয়, আপনি তারপরে আপনার পছন্দসই "নেটিভ বিল্ড এনভায়রনমেন্ট" এর কাজ করার জন্য প্রয়োজনীয় সমস্ত ফাইল তৈরি করতে আপনি সিএমকে ব্যবহার করুন। লিনাক্সে, ডিফল্টরূপে, এর অর্থ মেকফাইলস। আপনি একবার সিএমকে চালানোর পরে, এটি নিজস্ব ব্যবহারের জন্য কিছু 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_TYPE
DEBUG তে সেট করা হয় তবে পরিবর্তে ব্যবহৃত হবে । এ জাতীয় আরও কিছু আছে; খুঁজে বার করো 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
এগুলির চতুর ব্যবহারের সাথে আপনি শীতল জিনিস যেমন লাইব্রেরি বন্ধ করা ইত্যাদি করতে পারেন। আমি সেই টিউটোরিয়ালটি একবার দেখার পরামর্শ দিই কারণ আরও কিছু উন্নত জিনিস রয়েছে যা বড় বা প্রকল্পগুলিতে খুব তাড়াতাড়ি বা পরে খুব কার্যকর হতে বাধ্য।
অন্য সব কিছুর জন্য, স্ট্যাক ওভারফ্লো নির্দিষ্ট প্রশ্ন এবং সংক্ষিপ্ত উত্তরগুলির সাথে ঝাঁকুনি দিচ্ছে, যা অবিচ্ছিন্ন ছাড়া সবার জন্য দুর্দান্ত।