জিসিসিকে সরাসরি একটি লাইব্রেরি স্থিতির সাথে লিঙ্ক করতে বলছি


133

আমি কোন লাইব্রেরি স্থিতির সাথে সংযুক্ত করতে চাই তা -Wl,-Bstaticজানাতে আমার ব্যবহার করা gccঅবাক লাগে। সর্বোপরি আমি gccলাইব্রেরি ( -Ldir, -llibname) এর সাথে লিঙ্ক করার বিষয়ে অন্যান্য সমস্ত তথ্য সরাসরি বলছি ।

কোন লাইব্রেরি স্থিতিশীলভাবে সংযুক্ত করা উচিত তা সরাসরি জিসিসি ড্রাইভারকে বলা সম্ভব?

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

উত্তর:


189

এটি অবশ্যই সম্ভব, -l:পরিবর্তে ব্যবহার করুন -l। উদাহরণস্বরূপ -l:libXYZ.aসাথে লিঙ্ক libXYZ.alibলিখিত আউট লক্ষ্য করুন , -lXYZযার বিপরীতে স্বয়ংক্রিয়ভাবে প্রসারিত হবে libXYZ


63
Godশ্বর যদি কেবল জ্ঞু লাইব উপসর্গের উন্মাদনার পরিবর্তে প্রথম স্থানে এটি ডিফল্ট করে তুলেছিলেন। ওহ সময় এবং হতাশা আমরা বাঁচতে হবে।
টিম্ম্ম্ম

9
রাদেক, এই -l:বিকল্পটি নথিভুক্ত করা হয়? আমার জিসিসি এর কোন সংস্করণটি ব্যবহার করা দরকার?
ওএসজিএক্স

18
প্রকৃতপক্ষে, এটি ldলিঙ্কার উত্সঅর্ডার.অর্গ / বিিন্টিলস / ডকস / জমিদারি / অপশনস html "এর বিকল্প -l namespec.. ELF .. সিস্টেমে .. ফাইল নামে একটি ফাইলের জন্য পাথ libnamespec.a নামক একটি সন্ধানের আগে libnamespec.so নামক একটি লাইব্রেরির জন্য একটি ডিরেক্টরি অনুসন্ধান করবে। নোট করুন যে এই আচরণটি: ফাইলনামের ক্ষেত্রে প্রযোজ্য নয় , যা সর্বদা ফাইলের নাম নামক একটি ফাইল নির্দিষ্ট করে । যেহেতু বিনুটিস ২.১18
সোর্সওয়্যার.আর.ইগ.

17
এই ইন্টারফেসের জন্য জিএনইউ কোথাও দায়ী নয়, এটি ইউনিক্স সরঞ্জামচেন থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল।
আকিম

এটি নন-জিএনইউ লিংকারগুলিতে কাজ করে না এটি লজ্জাজনক। অদ্ভুত লিঙ্ক ফ্ল্যাগ ওয়ার্কআউন্ডগুলি ছাড়াই স্থির লাইব্রেরিগুলি সন্ধান করার জন্য এলডিএলবিএস এবং অনুরূপ কনফিগার বিকল্পগুলি "বল প্রয়োগ" করার একটি দুর্দান্ত উপায়।
নিনেনিও

130

লিঙ্কিং কমান্ডে আপনি .a ফাইল যুক্ত করতে পারেন:

  gcc yourfiles /path/to/library/libLIBRARY.a

তবে এটি জিসিসি ড্রাইভারের সাথে কথা বলছে না, তবে ldলিঙ্কারের সাথে বিকল্প হিসাবে পছন্দ -Wl,anythingকরছে।

আপনি যখন সিসি বা এলডি বলবেন -Ldir -lLIBRARY, লিঙ্কার লাইব্রেরির স্থির এবং গতিশীল সংস্করণ উভয়ই পরীক্ষা করবেন (আপনি এর সাথে কোনও প্রক্রিয়া দেখতে পারবেন -Wl,--verbose)। পরীক্ষিত লাইব্রেরির ক্রম পরিবর্তন করতে আপনি -Wl,-Bstaticএবং ব্যবহার করতে পারেন -Wl,-Bdynamic। এখানে gnu LD এর একটি ম্যান পেজ: http://linux.die.net/man/1/ld

আপনার প্রোগ্রামটি lib1 এর সাথে লিঙ্ক করতে, lib3 গতিশীল এবং lib2 স্থিরভাবে, এই জাতীয় জিসিসি কল ব্যবহার করুন:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

ধরে নিই যে ld এর ডিফল্ট সেটিংসটি ডায়নামিক লাইব্রেরি ব্যবহার করা হয় (এটি লিনাক্সে রয়েছে)।


3
সংক্ষিপ্ত সংস্করণ: স্রোতের সাথে এটি করার কোনও উপায় নেই gcc
এলাজার লাইবোভিচ

7
এলাজার লাইবোভিচ, তবে gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3কৌশলটি করেন।
osgx

13
লিঙ্কিং (এবং ডিন / স্ট্যাটিক libs অনুসন্ধান) লিঙ্কার দ্বারা সম্পন্ন হয়, সুতরাং, আপনাকে লিঙ্কার বিকল্পগুলি ব্যবহার করতে হবে। -lএবং -Lলিঙ্কার বিকল্পগুলি।
osgx

3
এই উত্তরটি কি কারণে gcc yourfiles /path/to/library/libLIBRARY.aবা উচ্চতর উত্তীর্ণ হয় -Wl,-Bstatic?
টোর ক্লিংবার্গ

7
@ টোরক্লিংবার্গ, ভেরিয়েন্ট 1-র /path/to/library/libLIBRARY.aসম্পূর্ণ লেখার জন্য প্রয়োজন, ভেরিয়েন্ট 2টি -Wl,-Bstatic -llib2 -Wl,-Bdynamicদীর্ঘ দীর্ঘ এবং 2 টি অতিরিক্ত বিকল্প যুক্ত করেছে এবং বিডিনামিক হিসাবে ডিফল্ট মোড ধরে নিয়েছে, এবং স্বীকৃত বৈকল্পিক 3 -l:libXYZ.aসংক্ষিপ্ত এবং ঠিক কাজ করে। তিনটিই অনেক ক্ষেত্রে কাজ করবে এবং স্ট্যাটিক প্রোগ্রামগুলির লিঙ্ক করার সময় ভেরিয়েন্ট 2 কাজ করতে পারে না। Lib এর জন্য আসল সংযোগের ধাপটি আমি যেভাবে বুঝি সমস্ত রূপগুলিতে একই।
osgx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.