লাইব্রেরির উত্সগুলি যুক্ত করার পরিবর্তে আমার যুক্ত করা উচিত?


14

আমি সি ++ এ তুলনামূলকভাবে নতুন, সুতরাং আমার কীভাবে ছোট নির্ভরতা (উদাহরণস্বরূপ, একটি স্ক্রিপ্টিং ভাষা, বা জেএসএন / ওয়াইএএমএল / এক্সএমএল পার্সার) হ্যান্ডেল করা উচিত তা সম্পর্কে আমি নিশ্চিত নই।

আমি কি আলাদা প্রকল্প তৈরি করব এবং সেগুলি স্থির লাইব্রেরি হিসাবে যুক্ত করব, বা আমার মূল প্রকল্পে কেবলমাত্র .h / .cpp ফাইলগুলি রাখার উত্সাহ রয়েছে?

পরেরটি অনেক সহজ বলে মনে হচ্ছে কারণ আমি বেমানান লাইব্রেরিগুলি (লাইব্রেরিটি তৈরির সময় বিভিন্ন সংকলক সেটিং) নিয়ে বেশ কয়েক ঘন্টা ব্যয় করেছি, তবে আমি সি ++ ভুল উপায়ে শিখতে চাই না।

যদি এগুলি পৃথক গ্রন্থাগার হিসাবে রাখাই ভাল হয় তবে আমি কীভাবে সংকলনের পতাকাগুলি সিঙ্কে রাখি যাতে .lib / .a ফাইলগুলি সফলভাবে আমার আবেদনের সাথে লিঙ্ক করে?

(আমি বর্তমানে এমএসভিসি 2015 এর সাথে কাজ করছি, তবে লক্ষ্যটি হল ম্যাক ওএস এক্স এবং আইওএসে এক্সকোড / ক্ল্যাং ব্যবহার করে সংকলন করা, যাতে আমাকে কমপক্ষে 3 বিভিন্ন ধরণের লাইব্রেরিগুলি মোকাবেলা করতে হয় (উইন এক্স 86, ম্যাক এক্স 64, এআরএম) )


5
এবিআইস এ দেখুন এবং তারা আপনাকে সন্ধান করবে
বাসিলিভস ২

1
মনে রাখবেন যে কয়েকটি লাইব্রেরি এইভাবে ব্যবহারের উদ্দেশ্যে রয়েছেSQLite লাইব্রেরির পছন্দের ব্যবহার প্যাটার্ন এক্সিকিউটেবল মধ্যে কম্পাইল করার জন্য একটি C অথবা সি ++ আবেদন উৎস গাছে একীভূত উৎস এবং হেডার ফাইল ড্রপ হয়।
মার্ক বেনিংফিল্ড

উত্তর:


6

TLDR;

আপনি উত্স যোগ করা উচিত ? হ্যাঁ এক্স উত্স যোগ করা
উচিত ? নির্ভর করে

এখানে কেন ...

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

আর একটি গুরুত্বপূর্ণ সংস্করণ হচ্ছে। আপনার কি প্রতিটি লাইব্রেরি আলাদাভাবে সংস্করণ করা দরকার? প্রত্যেকের বিরুদ্ধে পরীক্ষা চালাবেন? এটি অনেক দলের সদস্যদের মধ্যে বিতরণ করবেন? আপনি যদি করেন গ্রন্থাগারগুলি দুর্দান্ত, এবং চলাফেরার জন্য সুবিধাজনক তবে আবার মনে হচ্ছে আপনিও এটির যত্ন নিচ্ছেন না।

এখানে চূড়ান্ত বিষয়টি হ'ল এটি একটি অতিরিক্ত ওভারহেড, এবং উত্স ফাইলগুলি বাদ দেওয়া আপনার ক্ষেত্রে সহজ, যা গ্রন্থাগারগুলি ব্যবহার না করে উত্সগুলিতে বাদ পড়ার পক্ষে একটি দৃ strong় পয়েন্ট দেয়। যেমন আপনি লক্ষ্য করেছেন, একবার আপনি একটি একক সংকলক সেটিংস পরিবর্তন করেন, আপনাকে অন্যথায় সমস্ত নির্ভরতা তাড়াতে হবে।

আমি অভিজ্ঞতা থেকে এই সব জানি:

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

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

অবশেষে, আপনার কাছে সবচেয়ে প্রাসঙ্গিক, আমি একটি সি ++ গেম প্রকল্পে কাজ করেছি। এই গেমটির জন্য কেবল ক্লায়েন্টের পাশে একটি গেম ইঞ্জিন, নেটওয়ার্ক রিয়েলটাইম ক্লায়েন্ট, নেটওয়ার্ক এইচটিটিপি ক্লায়েন্ট, এআই এবং একটি জেদী স্টোর লেখা হয়েছিল। আমি কী বেছে নিয়েছি? ক্লিয়ন + গ্রন্থাগারগুলি। যদিও আমি লাইব্রেরি ব্যবহার করছিলাম, তবে আমি মনে করি না। সমস্ত উত্সগুলি ক্লিয়ন আইডিই প্রকল্পে ছিল এবং সিএমকেলিস্টগুলি রচনা করে আমি সমস্ত বিল্ড ট্রিগার করতে এবং তাদেরকে একটি স্ট্রোকের সাথে সংযুক্ত করতে সক্ষম হয়েছি।

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

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


2

সি ++ লাইব্রেরির সাথে সংযোগ স্থাপনে প্রচুর ঝামেলা প্রয়োজন এবং এটি সঠিকভাবে করার জন্য প্রচুর জ্ঞান এবং প্রচেষ্টা প্রয়োজন। এটি সি ++ শিখার জন্য ভয়ঙ্কর হতে পারে।


প্রায়শই, নির্দিষ্ট সি ++ গ্রন্থাগারের লেখক / রক্ষণাবেক্ষণকারীরা এটি মনে রাখবেন এবং একটি উপায় বা অন্যভাবে প্রস্তাব দেবেন।

অন্য কথায়, যদি লেখক / রক্ষণাবেক্ষণকারীকে গ্রন্থাগার মনস্থ করা হেডার (* জ দ্বারা অন্তর্ভুক্ত করা .hpp শুধুমাত্র), অথবা উৎস (দ্বারা অন্তর্ভুক্ত জ *, বা ), এটা রিডমি যাতে পরিষ্কারভাবে বলেন না বা ডকুমেন্টেশন।


ক্রস-প্ল্যাটফর্ম (এবং একাধিক সি ++ সংকলক বিক্রেতাদের এবং পরিবেশের সাথে সামঞ্জস্যপূর্ণ) হিসাবে রক্ষিত লাইব্রেরিতে প্রায়শই একটি মেকফাইল সিস্টেম বা বিল্ড কনফিগারেশন সিস্টেম থাকে (যেমন সিএমকেক)। এই সিস্টেমগুলি প্ল্যাটফর্মের পার্থক্যগুলিকে মসৃণ করতে শিরোনামের শিমগুলি তৈরি করতে এবং সঠিক কমান্ড-লাইন বিকল্পগুলি এবং সঠিক ক্রম ব্যবহার করে উত্স ফাইলগুলিতে সংকলক এবং লিঙ্কারকে আহ্বান করবে এমন স্ক্রিপ্টগুলি তৈরি করতে ব্যবহৃত হয়। প্ল্যাটফর্ম এবং কনফিগারেশনের উপর নির্ভর করে এই বিল্ড সিস্টেমগুলিতে নির্দিষ্ট শিরোনাম বা উত্স ফাইলগুলি অন্তর্ভুক্ত বা বাদ দিতে পারে বা তারা নির্দিষ্ট প্রিপ্রসেসর চিহ্নগুলি সংজ্ঞায়িত বা অপরিবর্তিত করতে পারে।


লেখক / রক্ষণাবেক্ষণকারীদের সুপারিশের বিরুদ্ধে যাওয়া সম্ভব তবে এটির জন্য সর্বদা একটি বিস্তৃত পোর্টিং প্রচেষ্টা প্রয়োজন। এই পোর্টিং প্রচেষ্টার জন্য প্রয়োজনীয় কাজের পরিমাণটি আলাদা সি ++ পরিবেশে পোর্টিংয়ের সাথে তুলনীয় হতে পারে।


যেহেতু ভিজ্যুয়াল সি ++ প্রজেক্টের বর্ণনা ফাইলের উপর ভিত্তি করে নিজস্ব বিল্ড সিস্টেম ব্যবহার করে (আংশিকভাবে এক্সএমএল-ভিত্তিক), এটি লিনাক্সের অধীনে ব্যবহৃত স্ক্রিপ্টিং-ভিত্তিক বিল্ড সিস্টেমের সম্পূর্ণ ভিন্ন। সিএমকে ব্যবহারের পদ্ধতিটি সিএমকে কনফিগারেশন সেটিংস নেওয়ার জন্য এবং তারপরে * .vcxproj ফাইলগুলিতে কনফিগারেশন বিকল্পগুলি বেক করা সহ পুরো ভিজ্যুয়াল সি ++ প্রকল্প কাঠামো নির্গত করে।

যদি সি ++ ভিজ্যুয়াল সি ++ এর সাথে সংযোগের সময় সমস্যা দেখা দেয় তবে * .vcxproj ফাইলগুলিতে বিল্ড সেটিংসটি ভিজ্যুয়াল স্টুডিও জিইউআই (তার প্রকল্পের সম্পত্তি পৃষ্ঠা ডায়ালগ ব্যবহার করে) ব্যবহার করে সংশোধন করা যেতে পারে। এটি ধরে নিয়েছে যে আপনি কয়েকটি গুরুত্বপূর্ণ সি ++ সংকলন এবং লিঙ্কিংয়ের সেটিংসের ডজন ডজন এর অর্থ এবং এর পরিণতি সম্পর্কে ভালভাবে বুঝতে পেরেছেন।

এখন ভিজ্যুয়াল সি ++ ব্যবহার করার মূ part়তম অংশটি এসেছে: আপনি যদি এক ডজন বিভিন্ন তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে থাকেন, তাদের সবার জন্য বিল্ড সেটিংস পরিবর্তন করার অর্থ প্রতিটি * .vcxproj ফাইলে যাওয়া, এবং জিইউআইতে এক ডজনের জন্য একই পরিবর্তনটি পুনরাবৃত্তি করা বার। একটি ঝামেলা, তবে এটি করা যেতে পারে, আপনি যদি এটি সঠিকভাবে করতে জানেন to

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


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

এই বিষয়ে একটি শিক্ষানবিশ থেকে বিশেষজ্ঞ গাইড সম্ভব, তবে এটি প্রকল্প-নির্দিষ্ট হতে চলেছে। বিভিন্ন প্রকল্প দ্বারা নির্বাচিত বিভিন্ন পছন্দগুলির জন্য গাইডের সম্পূর্ণ পুনর্লিখনের প্রয়োজন হবে।


আপনি যদি .vcxproj নির্গতের জন্য সিএমকে ব্যবহার করেন, .vcxproj পরিবর্তনের পরিবর্তে আপনি সিএমকে কনফিগার করতে পারেন
কালেথ

1

আমি হ্যাঁ বলব, যতক্ষণ এটি সহজ হয়। বেশ কয়েকটি সুবিধা রয়েছে:

  1. এটির দ্রুত এবং উন্নত কোডের ফলস্বরূপ, বিশেষত যদি আপনি লিংক সময় অপ্টিমাইজেশন চালু করেন।

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

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

  4. আপনি উদাহরণস্বরূপ 2017 ব্যবহার করার সময়, এমএসভিসি ++ 2013 এর সাথে সংকলিত নির্ভরতা সম্পর্কে চিন্তা করার দরকার নেই। বা ভাগ করা স্থিতিশীল এমএসভিসিআরটি।

  5. আপনি সহজেই ডিবাগ মোডে তৈরি করতে পারেন এবং লাইব্রেরিতে প্রবেশ করতে পারেন।

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

উদাহরণ হিসাবে, আমি কয়েকটি প্রকল্পে লিবাসব ব্যবহার করি এবং আমার উইন্ডোজ সমর্থন করা প্রয়োজন। libusb অটোটুলগুলি ব্যবহার করে যা একটি বিল্ড সিস্টেমের রসিকতা এবং উইন্ডোজে সত্যিই কোনওভাবে কাজ করে না। তারা পূর্বনির্ধারিত বাইনারি সরবরাহ করে তবে তারা এমএসভিসি ++ 2013 দিয়ে নির্মিত এবং 2017 এর সাথে কাজ করবে না far এখন পর্যন্ত সবচেয়ে সহজ সমাধানটি ছিল আমার প্রকল্পে সমস্ত প্রাসঙ্গিক। সি এবং .h ফাইল যুক্ত করা।


2
1) সত্যি? একটি স্ট্যাটিক লাইব্রেরি হ'ল অবজেক্ট ফাইলগুলির সংগ্রহ যেমন ঠিক আপনি সেগুলি সংকলন করেছিলেন।
বালড্রিক ২

আপনি .oযে ফাইলগুলি সংকলিত করেছেন -fltoসেগুলির সংরক্ষণাগার তৈরি করতে পারেন তবে সেগুলি সত্যই কোনও স্ট্যাটিক লাইব্রেরি নয় - ক্ল্যাংয়ের জন্য এগুলি এলএলভিএম বিটকোড ফাইল। এবং যদি আপনি স্থির লাইব্রেরিগুলি অন্য কেউ সরবরাহ করেন তবে এটি স্পষ্টতই কাজ করবে না।
টিম্ম্ম্ম

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