পুরানো সি ++ সংকলকগুলিতে কোনও সংকলিত সি ++ 11 লাইব্রেরি (lib, dll, ইত্যাদি) লিঙ্ক করা যেতে পারে?


12

পুরানো সি ++ সংকলক (যেমন VS2008 এবং gcc3.4) সি ++ 11 এ লিখিত বাহ্যিক লাইব্রেরির সাথে লিঙ্ক করতে পারে?

আমার ধারণা হ'ল সি ++ 11। লাইব ফাইলগুলি এই পর্যায়ে কেবল বাইট কোড হয় এবং এটি কোনওরকম সমাধানযোগ্য এবং কলযোগ্যতর হয় না কেন এটি কীভাবে তৈরি হয়েছিল তা পুরানো সংকলকদের বিরক্ত করা উচিত নয়।

আমি একটি ছোট লাইব্রেরি বিকাশ করছি যার এপিআই এখনও সি ++ 03 ব্যবহারকারীদের সমর্থন করে। সুতরাং, সামনের দিকে তাকিয়ে আমি ভাবছি যে আমার লাইব্রেরিটি std::unique_ptrযেমন এবং এর মতো সহায়ক বৈশিষ্ট্যগুলি ব্যবহার করে তা কার্যকর করা ঠিক আছে , বা আমাকে কেবল আটকে থাকতে হবে boost::?

উত্তর:


10

প্রদত্ত আপনার লাইব্রেরিটি কেবলমাত্র এটির প্রয়োগে সি ++ 11 ব্যবহার করে এবং সি ++ 11 সুবিধাগুলি বা প্রকারগুলি প্রকাশ্যে প্রকাশ করে না এবং বিশেষত যদি আপনি স্ট্যাটিক লিঙ্কেজ ব্যবহার করেন তবে হ্যাঁ, এটি সম্ভব এবং এমনকি আদর্শ।

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

আপনি কেবল আপনার লাইব্রেরির ক্লায়েন্টকে আপনার প্রয়োগের নির্ভরতার সাথে প্রকাশ করতে পারবেন না।

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


1
গ্রেট! ঠিক এটাই আমি আশা করছিলাম। আমি ব্যাপকভাবে সি ++ 11 ব্যবহার করার ইচ্ছা করি না তবে সুবিধাজনক হলে আমি আমার লুকানো বাস্তবায়নে ল্যাম্বডা ফাংশনটিতে দু'একটি পপ করতে পারি তা জেনে ভাল। সি এবং জাভা উপমাগুলি বোঝায়। ধন্যবাদ.
কোনফা

4

আপনি অন্যদের ব্যবহারের জন্য একটি নতুন লাইব্রেরি লিখতে চান এবং আপনি নিজের প্রয়োগের ভাষা হিসাবে C + 11 ব্যবহার করতে চান এমন শোনায়। বিবেচনা করার মতো কয়েকটি বিষয় রয়েছে:

  • সি ++ এর একটি নতুন সংস্করণ প্রবর্তনের মাধ্যমে আপনি আপনার লাইব্রেরিতে নতুন সি ++ রানটাইম লাইব্রেরি স্থাপন করার প্রয়োজনীয়তার পরিচয় করিয়ে দেবেন, তা কি ঠিক?
  • আপনার পাবলিক ইন্টারফেসে আপনার নতুন সি + 11 ধরণের ব্যবহার করা উচিত নয় , অন্যথায় তারা এটি কল করতে সক্ষম হবে না।
  • সাধারণভাবে, আপনার জটিল প্রকারগুলি, যেমন অনন্য_প্টার, এমনকি ভেক্টর ইত্যাদি এড়ানো উচিত you আপনি যদি আপনার লাইব্রেরিকে উত্স কোড হিসাবে বিতরণ না করেন তবে আপনার লাইব্রেরিতে থাকা অবজেক্টের বিন্যাস ক্লায়েন্ট কোডের বিন্যাস থেকে পৃথক হতে পারে। সরল প্রকারের সাথে আটকে থাকুন যাতে অবজেক্ট লেআউটটির ভিন্নতার কোনও ঝুঁকি থাকে না।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.