স্টার্টার হিসাবে, ডিরেক্টরিগুলির জন্য কিছু প্রচলিত নাম রয়েছে যা আপনি উপেক্ষা করতে পারবেন না, এটি ইউনিক্স ফাইল সিস্টেমের সাথে দীর্ঘ traditionতিহ্যের উপর ভিত্তি করে। এইগুলো:
trunk
├── bin : for all executables (applications)
├── lib : for all other binaries (static and shared libraries (.so or .dll))
├── include : for all header files
├── src : for source files
└── doc : for documentation
কমপক্ষে শীর্ষ-স্তরে এই বেসিক লেআউটটিতে লেগে থাকা সম্ভবত একটি ভাল ধারণা।
শিরোনাম ফাইল এবং উত্স ফাইল (সিপিপি) বিভক্ত সম্পর্কে, উভয় স্কিমই মোটামুটি সাধারণ। যাইহোক, আমি তাদের একসাথে রাখা পছন্দ করি, ফাইলগুলি একসাথে রাখাই প্রতিদিন কাজকর্মের জন্য আরও বেশি ব্যবহারিক। এছাড়াও, যখন সমস্ত কোড এক শীর্ষ-স্তরের ফোল্ডারের অধীনে থাকে, অর্থাৎ, trunk/src/
ফোল্ডারটি, আপনি লক্ষ্য করতে পারেন যে অন্যান্য সমস্ত ফোল্ডার (বিন, লিব, অন্তর্ভুক্ত, ডক এবং সম্ভবত কিছু পরীক্ষার ফোল্ডার) শীর্ষ স্তরে রয়েছে, পাশাপাশি কোনও উত্স-নির্মানের জন্য "বিল্ড" ডিরেক্টরিটি হ'ল সমস্ত ফোল্ডার যা বিল্ড প্রক্রিয়াতে উত্পন্ন ফাইলগুলি ছাড়া আর কিছুই থাকে না। এবং এইভাবে, কেবলমাত্র এসআরসি ফোল্ডারটির একটি সংস্করণ নিয়ন্ত্রণ সিস্টেম / সার্ভারের (গিট বা এসভিএন এর মতো) অধীনে রাখা বা আরও অনেক ভাল হওয়া দরকার up
এবং যখন গন্তব্য সিস্টেমে আপনার শিরোলেখ ফাইলগুলি ইনস্টল করার বিষয়টি আসে (আপনি যদি শেষ পর্যন্ত আপনার লাইব্রেরিটি বিতরণ করতে চান) তবে ভাল, সিএমকে ফাইলগুলি ইনস্টল করার জন্য একটি কমান্ড রয়েছে (স্পষ্টতই "ইনস্টল করুন" লক্ষ্য তৈরি করে "" ইনস্টল করুন "করতে") যা আপনি /usr/include/
ডিরেক্টরিতে সমস্ত শিরোলেখ ব্যবহার করতে পারেন । আমি এই উদ্দেশ্যে নিম্নলিখিত cmake ম্যাক্রো ব্যবহার করি:
# custom macro to register some headers as target for installation:
# setup_headers("/path/to/header/something.h" "/relative/install/path")
macro(setup_headers HEADER_FILES HEADER_PATH)
foreach(CURRENT_HEADER_FILE ${HEADER_FILES})
install(FILES "${SRCROOT}${CURRENT_HEADER_FILE}" DESTINATION "${INCLUDEROOT}${HEADER_PATH}")
endforeach(CURRENT_HEADER_FILE)
endmacro(setup_headers)
যেখানে SRCROOT
আমি সিআরসি ফোল্ডারে সেট করেছি এমন একটি চিত্তাকর্ষণ ভেরিয়েবল এবং INCLUDEROOT
যেখানে শিরোনামগুলি যেখানেই যেতে হবে সেখানে কনফিগার করে এমন চ্যাম্পে ভেরিয়েবল। অবশ্যই এটি করার আরও অনেকগুলি উপায় রয়েছে এবং আমি নিশ্চিত যে আমার উপায়টি সবচেয়ে ভাল নয়। মুল বক্তব্যটি হ'ল শিরোনামগুলি এবং উত্সগুলিকে বিভক্ত করার কোনও কারণ নেই কারণ কেবলমাত্র শিরোনামগুলি টার্গেট সিস্টেমে ইনস্টল করা দরকার, কারণ এটি খুব সহজ, বিশেষত সিএমকে (বা সিপ্যাক) দিয়ে শিরোনামগুলি বাছাই করে কনফিগার করা যায় to তাদের একটি পৃথক ডিরেক্টরিতে না রেখে ইনস্টল করুন। এবং বেশিরভাগ গ্রন্থাগারে আমি এটি দেখেছি।
উক্তি: দ্বিতীয়ত আমি আমার কোডটি একক পরীক্ষার জন্য গুগল সি ++ টেস্টিং ফ্রেমওয়ার্কটি ব্যবহার করা মোটামুটি সহজ বলে মনে করি। আপনি কি আমার কোড দিয়ে এটিকে বান্ডিল করার পরামর্শ দিচ্ছেন, উদাহরণস্বরূপ "ইনক / গেস্ট" বা "অবদান / গেস্ট" ফোল্ডারে? যদি বান্ডিল হয়, আপনি সংখ্যা বা ফাইলগুলি হ্রাস করতে fuse_gtest_files.py স্ক্রিপ্টটি ব্যবহার করার বা এটি যেমন রেখে দেওয়ার পরামর্শ দিচ্ছেন? যদি বান্ডিল না হয় তবে এই নির্ভরতা কীভাবে পরিচালনা করা হয়?
আপনার লাইব্রেরির সাথে নির্ভরতা বান্ডিল করবেন না। এটি সাধারণত একটি দুর্দান্ত ভয়ঙ্কর ধারণা এবং যখন আমি একটি লাইব্রেরি তৈরির চেষ্টা করতে গিয়ে আটকে যাই তখন আমি সর্বদা এটি ঘৃণা করি। এটি আপনার শেষ অবলম্বন হওয়া উচিত এবং সমস্যাগুলি থেকে সাবধান থাকুন। প্রায়শই লোকেরা তাদের লাইব্রেরির সাথে নির্ভরতা বান্ডিল করে কারণ তারা একটি ভয়াবহ বিকাশ পরিবেশ (যেমন উইন্ডোজ) টার্গেট করে, বা কারণ তারা কেবল প্রশ্নে গ্রন্থাগারের (নির্ভরতা) এর একটি পুরানো (অবচয়) সংস্করণ সমর্থন করে। মূল ক্ষতিটি হ'ল আপনার বান্ডেলড নির্ভরতা একই গ্রন্থাগার / অ্যাপ্লিকেশনটির ইতিমধ্যে ইনস্টল করা সংস্করণগুলির সাথে সংঘর্ষ হতে পারে (উদাহরণস্বরূপ, আপনি ব্রেস্টেল গেস্ট করেছেন, তবে আপনার লাইব্রেরিটি তৈরির চেষ্টা করা ব্যক্তি ইতিমধ্যে ইনস্টল হওয়া জাস্টের নতুন (বা পুরানো) সংস্করণ রয়েছে, তারপরে দু'জনে সংঘর্ষ হয় এবং সেই ব্যক্তিকে খুব বাজে মাথা ব্যথা দেয়)) সুতরাং, যেমনটি আমি বলেছি, নিজের ঝুঁকিতে এটি করুন, এবং আমি কেবলমাত্র সর্বশেষ উপায় হিসাবে বলব say আপনার গ্রন্থাগারটি সংকলন করতে সক্ষম হওয়ার আগে লোককে কয়েকটি নির্ভরতা ইনস্টল করার জন্য অনুরোধ করা আপনার বান্ডিলযুক্ত নির্ভরতা এবং বিদ্যমান স্থাপনাগুলির মধ্যে সংঘর্ষের সমাধানের চেষ্টা করার চেয়ে অনেক কম মন্দ।
উক্তি: পরীক্ষাগুলি লেখার বিষয়টি যখন আসে তখন এগুলি সাধারণত কীভাবে সংগঠিত হয়? আমি প্রতিটি ক্লাসের জন্য একটি সিপিপি ফাইল রাখার কথা ভাবছিলাম (উদাহরণস্বরূপ test_vector3.cpp) তবে সমস্তগুলি একটি বাইনারিতে সংকলিত হয়েছে যাতে সেগুলি সহজেই একসাথে চালানো যায়?
ক্লাস প্রতি এক সিপিপি ফাইল (বা ক্লাস এবং ফাংশনগুলির একটি ছোট সমন্বিত গ্রুপ) আমার মতে আরও স্বাভাবিক এবং ব্যবহারিক। তবে, অবশ্যই, এগুলি সমস্তগুলিকে একটি বাইনারি হিসাবে সংকলন করবেন না যাতে "তারা সবাই একসাথে চালানো যেতে পারে"। এটা সত্যিই খারাপ ধারণা। সাধারণত, যখন কোডিংয়ের কথা আসে, আপনি জিনিসগুলি যতটা করা যুক্তিসঙ্গত তত বেশি বিভক্ত করতে চান। ইউনিট-পরীক্ষাগুলির ক্ষেত্রে, আপনি সমস্ত পরীক্ষা চালানোর জন্য একটি বাইনারি চান না, কারণ এর অর্থ হল যে আপনি আপনার লাইব্রেরিতে যে কোনও কিছু পরিবর্তন করেন যা সেই ইউনিট-পরীক্ষা প্রোগ্রামটির প্রায় সম্পূর্ণ পুনঃনির্মাণের কারণ হতে পারে , এবং এটি পুনরায় সংশোধনের জন্য অপেক্ষা করতে কয়েক মিনিট / ঘন্টা হারিয়েছে। কেবল একটি সাধারণ স্কিমের সাথে আঁকুন: 1 ইউনিট = 1 ইউনিট-পরীক্ষা প্রোগ্রাম। তারপর,
উক্তি: যেহেতু গেষ্ট গ্রন্থাগারটি সাধারণত চতুর এবং মেক ব্যবহার করে নির্মিত হয়, তাই আমি ভাবছিলাম যে আমার প্রকল্পটিও এটির মতো নির্মিত হবে? যদি আমি নিম্নলিখিত প্রকল্পের বিন্যাসটি ব্যবহার করার সিদ্ধান্ত নিয়েছি:
আমি বরং এই বিন্যাসটি পরামর্শ দেব:
trunk
├── bin
├── lib
│ └── project
│ └── libvector3.so
│ └── libvector3.a products of installation / building
├── docs
│ └── Doxyfile
├── include
│ └── project
│ └── vector3.hpp
│_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
│
├── src
│ └── CMakeLists.txt
│ └── Doxyfile.in
│ └── project part of version-control / source-distribution
│ └── CMakeLists.txt
│ └── vector3.hpp
│ └── vector3.cpp
│ └── test
│ └── test_vector3.cpp
│_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
│
├── build
└── test working directories for building / testing
└── test_vector3
এখানে কয়েকটি বিষয় লক্ষণীয়। প্রথমত, আপনার এসআরসি ডিরেক্টরিতে সাব-ডিরেক্টরিতে আপনার অন্তর্ভুক্ত ডিরেক্টরিটির উপ ডিরেক্টরিগুলি আয়না করা উচিত, এটি কেবল বিষয়গুলি স্বজ্ঞাত রাখার জন্য (এছাড়াও, আপনার উপ-ডিরেক্টরি কাঠামোকে যথাযথভাবে সমতল (অগভীর) রাখার চেষ্টা করুন, কারণ ফোল্ডারগুলির গভীর নীড় অন্য যে কোনও কিছুর চেয়ে প্রায়শই ঝামেলা বেশি)। দ্বিতীয়ত, "অন্তর্ভুক্ত" ডিরেক্টরিটি কেবল একটি ইনস্টলেশন ডিরেক্টরি, এর বিষয়বস্তুগুলি এসআরসি ডিরেক্টরি থেকে যা কিছু শিরোনামই বেছে নেওয়া হয় are
তৃতীয়ত, সিএমকে সিস্টেমটি উত্স সাব-ডিরেক্টরিতে বিতরণ করার উদ্দেশ্যে তৈরি হয়েছে, শীর্ষ-স্তরের এক সিএমকেলিস্ট.সেক্সট ফাইল হিসাবে নয়। এটি জিনিসগুলিকে স্থানীয় রাখে এবং এটি ভাল (জিনিসগুলিকে স্বতন্ত্র টুকরো টুকরো টুকরো করার ক্ষেত্রে)। যদি আপনি একটি নতুন উত্স, একটি নতুন শিরোনাম, বা একটি নতুন পরীক্ষা প্রোগ্রাম যুক্ত করেন তবে আপনাকে যা প্রয়োজন তা হ'ল অন্য কিছুকে প্রভাবিত না করে প্রশ্নাবলীর সাব-ডিরেক্টরিতে একটি ছোট এবং সাধারণ সিএমকেলিস্ট.টেক্সট ফাইল সম্পাদনা করা। এটি আপনাকে ডিরেক্টরিগুলি সহজেই পুনর্গঠন করতে দেয় (সিএমকেলিস্টগুলি স্থানীয় এবং সাব-ডিরেক্টরিতে স্থানান্তরিত থাকাতে অন্তর্ভুক্ত)। শীর্ষ স্তরের সিএমকেলিস্টগুলিতে বেশিরভাগ শীর্ষ স্তরের কনফিগারেশন থাকতে হবে, যেমন গন্তব্য ডিরেক্টরি স্থাপন, কাস্টম কমান্ড (বা ম্যাক্রো), এবং সিস্টেমে ইনস্টল থাকা প্যাকেজগুলি সন্ধান করা। নিম্ন-স্তরের সিএমকেলিস্টগুলিতে কেবল শিরোনাম, উত্স,
উদ্ধৃতি: সিএমকেলিস্ট.টেক্সটকে কীভাবে দেখতে হবে যাতে এটি কেবল গ্রন্থাগার বা গ্রন্থাগার এবং পরীক্ষাগুলি তৈরি করতে পারে?
প্রাথমিক উত্তরটি হ'ল সিএমকে আপনাকে নির্দিষ্টভাবে "সমস্ত" থেকে নির্দিষ্ট লক্ষ্যগুলি বাদ দিতে দেয় (যা আপনি "মেক" টাইপ করলে তৈরি হয়) এবং আপনি লক্ষ্যগুলির নির্দিষ্ট বান্ডিলও তৈরি করতে পারেন। আমি এখানে একটি সিএমকে টিউটোরিয়াল করতে পারি না, তবে নিজের দ্বারা এটি সন্ধান করা মোটামুটি সোজা এগিয়ে forward এই নির্দিষ্ট ক্ষেত্রে, তবে, প্রস্তাবিত সমাধানটি অবশ্যই, অবশ্যই সিটিস্ট ব্যবহার করা, যা কেবলমাত্র কমান্ডের একটি অতিরিক্ত সেট যা আপনি সিএমকেলিস্ট ফাইলগুলিতে ইউনিট হিসাবে চিহ্নিত চিহ্নিত কয়েকটি লক্ষ্য (প্রোগ্রাম) নিবন্ধ করতে ব্যবহার করতে পারেন- পরীক্ষা। সুতরাং, সিএমকে সমস্ত পরীক্ষাগুলি একটি বিশেষ বিভাগের বিল্ডে রাখবে এবং আপনি ঠিক যা চেয়েছিলেন ঠিক তাই সমস্যা সমাধান করা হয়েছে।
উক্তি: এছাড়াও আমি বেশ কয়েকটি প্রকল্প দেখেছি যার বিল্ড বিজ্ঞাপন একটি বিন ডিরেক্টরি রয়েছে। বিল্ডটি কি বিল্ড ডিরেক্টরিতে ঘটে এবং তারপরে বাইনারিগুলি বিন ডিরেক্টরিতে চলে যায়? পরীক্ষাগুলির জন্য বাইনারিগুলি এবং গ্রন্থাগারটি কি একই জায়গায় থাকবে? অথবা এটি নীচে হিসাবে এটি কাঠামো আরও জ্ঞান করতে হবে:
উত্সের বাইরে একটি বিল্ড ডিরেক্টরি থাকা ("আউট-অফ-সোর্স" বিল্ড) করা কেবলমাত্র একমাত্র বুদ্ধিমান কাজ, এটি এখনকার ডি-ফ্যাক্টো স্ট্যান্ডার্ড। সুতরাং, স্পষ্টতই, উত্স ডিরেক্টরিটির বাইরে পৃথক "বিল্ড" ডিরেক্টরি থাকতে হবে, যেমন সিএমকে লোকেরা সুপারিশ করে এবং আমি যে যত প্রোগ্রামার আমার সাথে দেখা করেছি সেভাবেই হয়। বিন ডিরেক্টরি হিসাবে, ভাল, এটি একটি সম্মেলন, এবং এটি সম্ভবত এটি একটি ভাল ধারণা, যেমন আমি এই পোস্টের শুরুতে বলেছিলাম।
উদ্ধৃতি: আমি আমার কোড নথিতে ডক্সিজেন ব্যবহার করতে চাই। এটি কি স্বয়ংক্রিয়ভাবে cmake দিয়ে চালানো এবং তৈরি করা সম্ভব?
হ্যাঁ. এটি সম্ভবের চেয়ে বেশি, এটি দুর্দান্ত। আপনি কীভাবে অভিনবতা পেতে চান তার উপর নির্ভর করে বিভিন্ন সম্ভাবনা রয়েছে। সিএমকে ডক্সিজেনের (যেমন, find_package(Doxygen)
) জন্য একটি মডিউল রয়েছে যা আপনাকে কয়েকটি লক্ষ্যবস্তুতে অক্সিজেন চালাবে এমন লক্ষ্যগুলি নিবন্ধ করার অনুমতি দেয়। আপনি যদি আরও অভিনব জিনিসগুলি করতে চান, যেমন ডক্সিফাইলে সংস্করণ নম্বর আপডেট করা, অথবা স্বয়ংক্রিয়ভাবে কোনও তারিখ / লেখক স্ট্যাম্পগুলি উত্স ফাইলগুলির জন্য প্রবেশ করানো এবং এ জাতীয় কিছু, কিছুটা সিএমকে কুং-ফু দিয়ে এটি সম্ভব। সাধারণত এটি করার সাথে আপনি জড়িত থাকবেন যে আপনি সোর্স ডোক্সিফাইল রেখেছেন (যেমন, "ডক্সিফিল.ইন" যা আমি উপরের ফোল্ডারের বিন্যাসে রেখেছি) যা টোকেনগুলি খুঁজে পাওয়ার জন্য এবং সিএমেকের পার্সিং কমান্ড দ্বারা প্রতিস্থাপন করা হয়েছে। ইন আমার টপ লেভেল CMakeLists ফাইল , আপনি CMake কুং-Fu যে cmake-doxygen একসঙ্গে সঙ্গে কয়েক অভিনব জিনিস আছে এক ধরনের টুকরা পাবেন।