ব্লগ পোস্টটি বেশ ভুল।
আমি যতদূর জানি সি ++ এবিআই পরিবর্তনগুলি জিসিসির প্রতিটি বড় রিলিজের সাথে (যেমন বিভিন্ন প্রথম বা দ্বিতীয় সংস্করণের নম্বর উপাদানগুলির সাথে) চালু করা হয়েছে।
সত্য না. জিসিসি ৩.৪-এর পর থেকে কেবলমাত্র সি ++ এবিআই পরিবর্তনগুলি পশ্চাদপটে সামঞ্জস্যপূর্ণ, যার অর্থ সি ++ এবিআই প্রায় নয় বছর ধরে স্থিতিশীল রয়েছে।
বিষয়টিকে আরও খারাপ করার জন্য, বেশিরভাগ প্রধান লিনাক্স ডিস্ট্রিবিউশনগুলি জিসিসি স্ন্যাপশট ব্যবহার করে এবং / বা তাদের জিসিসি সংস্করণগুলি প্যাচ করে, আপনি বাইনারিগুলি বিতরণ করার সময় আপনি কী জিসিসি সংস্করণগুলি নিয়ে কাজ করতে পারেন তা সঠিকভাবে জানা অসম্ভব হয়ে পড়ে।
জিসিসির ডিস্ট্রিবিউশনগুলির প্যাচযুক্ত সংস্করণগুলির মধ্যে পার্থক্যগুলি সামান্য, এবং এবিআই পরিবর্তন হচ্ছে না, যেমন ফেডোরার 4.6.3 20120306 (রেড হ্যাট ৪.6.৩-২) অ্যাবিআই প্রবাহিত এফএসএফ ৪.6.x রিলিজের সাথে সামঞ্জস্যপূর্ণ এবং প্রায় কোনও 6.6 সহ। অন্য কোনও ডিস্ট্রো থেকে এক্স।
জিএনইউ / লিনাক্সে জিসিসির রানটাইম লাইব্রেরিগুলিতে ইএলএফ প্রতীক সংস্করণ ব্যবহার করা হয়েছে যাতে অবজেক্ট এবং লাইব্রেরিগুলির জন্য প্রয়োজনীয় প্রতীক সংস্করণগুলি পরীক্ষা করা সহজ হয় এবং যদি আপনার এমন একটি libstdc++.so
চিহ্ন থাকে যা এটি কাজ করবে তবে এটি কিছুটা ভিন্ন প্যাচযুক্ত সংস্করণ কিনা তা বিবেচ্য নয় doesn't আপনার distro এর অন্য সংস্করণ থেকে।
তবে যদি কাজ করা হয় তবে কোনও সি ++ কোড (বা সি ++ রানটাইম সমর্থন ব্যবহারকারী কোনও কোড) গতিযুক্তভাবে লিঙ্কযুক্ত হতে পারে না।
এটিও সত্য নয়।
এটি বলেছে, স্থিতিশীলভাবে সংযুক্ত করা আপনার libstdc++.a
পক্ষে একটি বিকল্প।
আপনি যদি কোনও লাইব্রেরি (ব্যবহার করে dlopen
) ডায়নামিকভাবে লোড করেন তবে এটি কাজ না করার কারণটি হ'ল আপনি যখন (স্ট্যাটিকালি) এটি সংযুক্ত করেছিলেন তখন আপনার অ্যাপ্লিকেশনটির কাছে libstdc ++ চিহ্নের প্রয়োজন হয় না, সুতরাং সেই চিহ্নগুলি আপনার কার্যকর করার যোগ্য উপস্থিত হবে না। এটি ভাগ করে নেওয়া লাইব্রেরির সাথে গতিশীলভাবে সংযোগ স্থাপনের মাধ্যমে সমাধান করা যেতে পারে libstdc++.so
(এটি নির্ভর করে তবে যা করা সঠিক জিনিস)) ইএলএফ প্রতীক আন্তঃব্যবস্থার অর্থ আপনার এক্সিকিউটেবলের মধ্যে উপস্থিত চিহ্নগুলি ভাগ করা লাইব্রেরি দ্বারা ব্যবহৃত হবে, তবে অন্যরা তা নয় আপনার এক্সিকিউটেবলের মধ্যে উপস্থিত libstdc++.so
এটির সাথে যা লিঙ্ক করে তা পাওয়া যাবে । যদি আপনার অ্যাপ্লিকেশনটি ব্যবহার না করে তবে dlopen
আপনাকে সে সম্পর্কে যত্ন নেওয়ার দরকার নেই।
অন্য একটি বিকল্প (এবং আমি পছন্দ করি এমনটি ) হ'ল libstdc++.so
আপনার অ্যাপ্লিকেশনের পাশাপাশি আরও নতুন স্থাপনা করা এবং এটি ডিফল্ট সিস্টেমের আগে পাওয়া যায় তা নিশ্চিত করা libstdc++.so
, যা ডায়নামিক লিংকটিকে সঠিক জায়গায় দেখার জন্য জোর করে তৈরি করা যেতে পারে, হয় $LD_LIBRARY_PATH
রান-এ পরিবেশ পরিবর্তনশীল ব্যবহার করে- সময়, বা RPATH
লিঙ্ক-সময়ে এক্সিকিউটেবলের মধ্যে একটি সেট করে। আমি RPATH
অ্যাপ্লিকেশনটি কাজ করার জন্য পরিবেশটি সঠিকভাবে সেট করা হচ্ছে না বলে এটি ব্যবহার করতে পছন্দ করি । আপনার সাথে আপনার আবেদন লিঙ্ক করেন '-Wl,-rpath,$ORIGIN'
(নোট শেল প্রসারিত করার চেষ্টা প্রতিরোধ একক উদ্ধৃতি $ORIGIN
) তাহলে এক্সিকিউটেবল থাকবে একটি RPATH
এর $ORIGIN
যা এক্সিকিউটেবল নিজেই হিসাবে একই ডিরেক্টরির মধ্যে ভাগ লাইব্রেরির জন্য চেহারায় গতিশীল linker বলে। নতুন করে রাখলেlibstdc++.so
এক্সিকিউটেবলের মতো একই ডিরেক্টরিতে এটি রান-টাইমে পাওয়া যাবে, সমস্যা সমাধান হয়েছে। (অন্য বিকল্প এক্সিকিউটেবল করা হয় /some/path/bin/
এবং নতুন আগে থেকে libstdc ++। তাই /some/path/lib/
এবং সাথে লিঙ্ক '-Wl,-rpath,$ORIGIN/../lib'
এক্সিকিউটেবল করার বা অন্য কোন নির্দিষ্ট অবস্থান আপেক্ষিক, এবং সেট করার RPATH আপেক্ষিক $ORIGIN
)
-static-libstdc++
বিকল্পটির কোনও অর্থ হবে না , আপনি কেবল ব্যবহার করবেন-static