ক্রস-প্ল্যাটফর্মের সামঞ্জস্যতা নিশ্চিত করার কৌশলগুলি (সি ++)?


13

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

কোডটি সমস্ত প্ল্যাটফর্মের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য কী কৌশলগুলি আগে থেকেই বিদ্যমান? একসাথে সমস্ত প্ল্যাটফর্ম বিকাশ করা, এভাবে প্রতিটি প্ল্যাটফর্মের বিপরীতে কোডটি পরীক্ষা করা, যখন নতুন বৈশিষ্ট্য যুক্ত করা হয়, একে অপরের পরে একের পরে বিভিন্ন প্ল্যাটফর্মের সংস্করণগুলি বিকাশ করা হয়? (*)

সুনির্দিষ্টভাবে পরামর্শ দেওয়া যে এটি সরঞ্জামগুলির উপর নির্ভরশীল নয়, বরং "বিকাশ প্রক্রিয়াগুলি" যা কোনও সরঞ্জাম ব্যবহার করা ছাড়াই ক্রস-প্ল্যাটফর্মের সামঞ্জস্যকে সহায়তা করে। উপরের মত (*) পছন্দ করুন।


বিশেষত আমি ডাব্লুডিএল-ওএল ( https://github.com/olilarkin/wdl-ol ) এবং কিছু ক্রস প্ল্যাটফর্ম ডিএসপি লাইব্রেরি সহ একটি ভিএসটি প্লাগ-ইন বিকাশ করছি । ডাব্লুডিএল-ওএল প্রকল্পগুলির ভিএস এবং এক্সকোড উভয়ই প্রকল্প স্থাপন করা আছে তবে আমি অনুমান করি যে সমস্যাগুলি গ্রন্থাগারগুলি থেকে আসে এবং তারপরে সংকলকগুলির মধ্যে পার্থক্য রয়েছে।


1
বহনযোগ্যতা নিশ্চিত করার কোনও উপায় নেই , কেবল বহনযোগ্যতার উন্নতি / সর্বাধিকীকরণের উপায়গুলি
ফুচলভি

এবং কেন এটি একটি সদৃশ নয়? আমি বিশ্বাস করি অনেকগুলি অনুরূপ প্রশ্ন ছিল
ফুচলভি

আপনার আবেদন কি করছে? কিভাবে আপনি এটি ব্যবহার করেন? কমান্ড লাইনে, বা কিছু গ্রাফিকাল ইন্টারফেসের মাধ্যমে? এটির উন্নতি করতে দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন
বেসাইল স্টারিনকিভিচ

এবং আপনি কোন কাঠামো ব্যবহার করছেন?
বেসিল স্টারিঙ্কেভিচ

উত্তর:


15

পোর্টেবল কোড তৈরি করা খুব চ্যালেঞ্জিং হতে পারে।

প্রথমে ভাষা সম্পর্কিত কিছু স্পষ্ট পরামর্শ:

  • স্ট্যান্ডার্ড সি ++ ব্যবহার করুন এবং সাবধানতার সাথে কোনও অপরিবর্তিত আচরণ এড়ান
  • প্রাথমিকভাবে স্ট্যান্ডার্ড লাইব্রেরিতে নির্ভর করুন (এবং বহনযোগ্য গ্রন্থাগার যেমন বুস্ট )
  • সর্বদা সমস্ত প্রত্যাশিত শিরোনাম অন্তর্ভুক্ত করুন। ধরে নিবেন না যে আপনার শিরোনামের দরকার নেই কারণ এটি অন্য একটিতে অন্তর্ভুক্ত রয়েছে (যেমন একটি নির্দিষ্ট প্রয়োগের জন্য !): এটি সংকলনের ত্রুটিগুলি সৃষ্টি করতে পারে
  • কম্পাইলার দ্বারা সমর্থিত কিন্তু সি ++ স্ট্যান্ডার্ড (যেমন বেনামে স্ট্রাক্ট বা ভেরিয়েবল দৈর্ঘ্যের অ্যারে ) দ্বারা গ্যারান্টিযুক্ত নয় এমন কনস্ট্রাক্টগুলি এড়ান : সংকলন ত্রুটি ঘটাতে পারে ।
  • আপনাকে সম্মতি প্রয়োগে সহায়তা করতে সংকলক বিকল্পগুলি ব্যবহার করুন (নির্দিষ্ট সংযোজন সংকলক অক্ষম করা, ফিরে আসা সতর্কতা বার্তাগুলির স্তরকে সর্বাধিক করুন)
  • অনেক বাস্তবায়ন নির্ভরশীল বহনযোগ্যতা ফাঁদ আছে: এটি যে কোড কাজ করে যথেষ্ট নয় মনে রাখা এর (এমনকি প্রাথমিক) ধরনের তথ্য আকার, অক্ষর যা হতে পারে স্বাক্ষরিত বা স্বাক্ষরবিহীন ডিফল্টরূপে , সম্পর্কে অনুমানের endianness , এক্সপ্রেশন মূল্যায়ন ক্রম যখন এই পার্শ্ব প্রতিক্রিয়া , ইত্যাদি ব্যবহার করুন

তারপরে বেশ কয়েকটি নকশার সুপারিশ:

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

অবশেষে সূক্ষ্ম বিষয়:

  • অক্ষর এনকোডিং: অনেক সিস্টেমে আপনি utf8 এর উপর নির্ভর করতে পারেন । তবে উইন্ডোজের পক্ষে এটি আরও সূক্ষ্ম কারণ সিস্টেমটি হয় আনসি বা utf-16 আশা করে। আপনি অবশ্যই (যেমন একটি typedef উপর নির্ভর করতে পারেন TCHAR), কিন্তু এই তারপর মান গ্রন্থাগার সঙ্গে একযোগে চ্যালেঞ্জ (যেমন হতে পারে coutবনাম wcoutব্যবহার করা নির্ভর করে ব্যবহার করা হয় তবে charঅথবা wchar_t)
  • যদি জিইউআই / গ্রাফিক্স / উন্নত আই / ও এর জন্য আপনি কোনও পোর্টেবল লাইব্রেরি খুঁজে পান না যা আপনার প্রত্যাশা / প্রয়োজনীয়তার সাথে সার্থক হয় তবে ওএস-নির্দিষ্ট উপাদানগুলি বিচ্ছিন্ন করার জন্য সামগ্রিক আর্কিটেকচারটি ডিজাইন করুন। জড়িত বিভিন্ন পৃথক মিথস্ক্রিয়া এবং ধারণার কারণে, র্যাপারগুলি এখানে যথেষ্ট নাও হতে পারে।
  • কিছু আকর্ষণীয় নকশার নিদর্শনগুলির সুবিধা নিন যেমন উদাহরণস্বরূপ বিমূর্ত কারখানা (ওএস নির্দিষ্ট ইউআই হিসাবে সম্পর্কিত বিষয়গুলির পরিবারগুলি ডিজাইনের জন্য আদর্শ) বা মধ্যস্থতা (সম্পর্কিত বিষয়গুলির পরিবারের মধ্যে সহযোগিতা বাস্তবায়নের জন্য আদর্শ) এবং শর্তসাপেক্ষ সংকলনের সাথে তাদের একসাথে ব্যবহার করুন ।

তবে এগুলি কেবল পরামর্শ। এই ক্ষেত্রে আপনি নিশ্চিততা অর্জন করতে পারবেন না।


-Wall -Wextra -Werror
পাইপ

1
@ পাইপ আপনারও হওয়া উচিত -pedantic
5gon12eder

@ 5gon12eder এই উত্তরের প্রসঙ্গে একটি খুব ভাল পয়েন্ট।
পাইপ

11

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

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

ওএসএক্স সিআই যদিও বেশ জটিল।


কোন উল্লেখ নেই, সিআই কি?
mavavilj

5
অবিচ্ছিন্ন একীকরণ- মূলত এমন সার্ভারগুলির একগুচ্ছ যা আপনার জন্য বিল্ড এবং পরীক্ষা চালায়।
ডেডজিমি

@ ডেড এমজি আপনি মোজিলা টিন্ডারবক্সের মতো বোঝাচ্ছেন?
দামিয়ান ইয়ারিক

1
ট্র্যাভিস সিআই বিনামূল্যে ওএসএক্স বিল্ড হোস্টগুলি সরবরাহ করে
দেনেইথ

শুধু Cmake ব্যবহার করুন।
রাজ

9

আপনি যদি "বিকাশ প্রক্রিয়াগুলি" জিজ্ঞাসা করছেন এবং আপনার প্রাথমিক বিকাশ প্ল্যাটফর্মটি হ'ল উইন্ডোজের সাথে ভিজ্যুয়াল স্টুডিও তবে আমি আপনাকে "উইন্ডোজ এইচ" অন্তর্ভুক্ত না করে আপনার প্রকল্পটি তৈরির চেষ্টা করার পরামর্শ দেব। আপনি প্রচুর সংকলন ত্রুটি পাবেন যা আপনাকে এমন অনেক জায়গায় নির্দেশ করবে যেখানে আপনাকে নিজের কোডটি রিফেক্টর করতে হবে। উদাহরণস্বরূপ, 'ডিডবর্ড' # সংজ্ঞায়িত হবে না এবং আপনাকে এটিকে uint32_tসর্বত্র প্রতিস্থাপন stdint.hকরতে হবে (এর জন্য গুগল এবং আপনি পূর্ণসংখ্যার ধরণ এবং তাদের ক্রস-প্ল্যাটফর্ম সংজ্ঞা সম্পর্কে দরকারী তথ্য পাবেন)। এর পরে, আপনাকে উইন 32 এপিআইতে সমস্ত কলগুলি প্রতিস্থাপন করতে হবে, যেমন,Sleep()তাদের ক্রস-প্ল্যাটফর্ম সমতুল্য (আবার, গুগল আপনার সেরা বন্ধু, যিনি স্ট্যাক * .কম সাইটগুলিতে প্রাসঙ্গিক প্রশ্নোত্তর দেখান)। আপনার কোডের জন্য সমস্ত প্রাসঙ্গিক ক্রস-প্ল্যাটফর্মের প্রতিস্থাপনগুলি সম্ভবত আপনি সফল করতে পারবেন না এবং আপনাকে আপনার include "windows."নির্দেশটি ফিরিয়ে দিতে হবে তবে এটির অধীনে রাখতে হবে #ifdef _WIN32- আরও বিশদ এখানে

আরও দৃ concrete় প্রশ্ন জিজ্ঞাসা করা এবং উত্তর পেতে থাকুন - এটি "উন্নয়নের প্রক্রিয়াটি কী হওয়া উচিত" এর জন্য সাধারণ পরামর্শ

সম্পাদনা 1 আমার আরেকটি পরামর্শ হ'ল আপনার উইন্ডোজ বিকাশ মেশিনে (ভিজ্যুয়াল স্টুডিও সহ) জিসিসি এবং / বা ঝাঁকুনি ব্যবহার করা


3

এটি আপনার উল্লেখ করা "কয়েকটি সংকলন ত্রুটি" উপর নির্ভর করে। তারা কী ছিল তা না জেনে সুনির্দিষ্ট হওয়া অসম্ভব।

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

একটি উদাহরণ:

void myfunction(MyClass &);
myfunction(MyClass());

ফিরে আসার MyClassপরে মুছে ফেলা হয় যার একটি অস্থায়ী উদাহরণ তৈরি করে myfunction। আমার কয়েকটি সি ++ কম্পাইলারের সাথে, সেই উদাহরণটি পড়তে / লিখতে হবে (এবং এটি অস্থায়ী এবং শীঘ্রই ধ্বংস হয়ে যাবে এই সংকলকটিকে চিন্তিত করবেন না)। অন্যদের সাথে, myfunctionনিতে একটি নতুন সংজ্ঞা দিতে হয় const MyClass &, বা সংকলক অভিযোগ করে। সি ++ স্ট্যান্ডার্ড কী বলে বা কোন সংকলকটি সঠিক এবং কোনটি ভুল তা বিবেচ্য নয়। (ক) ত্রুটি বার কয়েক আমি জানি সম্মুখীন পর দুই ধরনের যেকোন একটি অস্থায়ী ভেরিয়েবল ডিক্লেয়ার MyClassএবং পাস যে myfunctionবা (খ) রেফারেন্স ঘোষণা constমধ্যে myfunctionএবং ব্যবহার mutableএখানে সেখানে deconstify করতে।

নীচের লাইন: অভিজ্ঞতা জমা করুন এবং আপনার নিজস্ব কোডিং মানগুলি বিকাশ করুন।


2
এটি এমএসভিসির একটি ভুল বৈশিষ্ট্য। আপনার বক্তব্যটি যদি 1 সিস্টেমে বিকাশ করে তবে এগুলি বিন্দুতে পয়েন্ট নিতে দেয়। তবে সেই নির্দিষ্ট জিনিসটি আপনার করা উচিত নয়।
জেডিগোগস

1
একাধিক সরঞ্জাম-চেইনগুলি ব্যবহার করার একটি ভাল বিষয় হ'ল তারা যে সাধারণ উপসেটটি গ্রহণ করে সেগুলি যথাযথভাবে মান, মান-সম্মতিযুক্ত সি ++ তাদের প্রত্যেকে স্বতন্ত্রভাবে যা গ্রহণ করবে তার চেয়ে বেশি হবে। আপনার ক্ষেত্রে, প্রদর্শিত কোডটি মান দ্বারা স্পষ্টতই ভুল এবং আপনার উল্লিখিত উভয় ফিক্সই বৈধ বিকল্প। আমি বলব এটি স্ট্যান্ডার্ড যা বলে তা বিবেচনা করে না
5gon12eder

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

3

সাহায্যের বহনযোগ্যতা একটি সম্ভাব্য উপায়ে নির্ভর হতে পারে শুধুমাত্র ঘোষণা এবং দ্বারা উপলব্ধ বৈশিষ্ট্য সি ++ 11 মান, এবং ক্রস-প্ল্যাটফর্ম লাইব্রেরি ও মত অবকাঠামো ব্যবহার করে Poco & কিউটি

তবে এটিও ব্যর্থ-প্রমাণ নয়। অ্যাফরিজম মনে রাখবেন

পোর্টেবল প্রোগ্রামের মতো কোনও জিনিস নেই, কেবলমাত্র এমন প্রোগ্রাম রয়েছে যা সফলভাবে পোর্ট করা হয়েছে (কিছু নির্দিষ্ট প্ল্যাটফর্মে)

অনুশীলন, শৃঙ্খলা এবং প্রচুর অভিজ্ঞতার সাথে একটি প্রোগ্রামকে অন্য প্ল্যাটফর্মে পোর্ট করা সাধারণত দ্রুত করা যেতে পারে। তবে অভিজ্ঞতা এবং জানা-কীভাবে অনেক গুরুত্বপূর্ণ।


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