দুটি "আর" স্থির গ্রন্থাগারকে কীভাবে একত্রী করবেন?


90

আমার 2 টি স্ট্যাটিক লিনাক্স লাইব্রেরি রয়েছে ar cr, libabc.aএবং এর দ্বারা নির্মিত libxyz.a
আমি এগুলিকে একটি স্ট্যাটিক লাইব্রেরিতে মার্জ করতে চাই libaz.a
কিভাবে আমি এটি করতে পারব.

অ্যাপ্লিকেশনগুলির চূড়ান্ত লিঙ্কটিতে দুটি লাইব্রেরি না দেওয়ার জন্য আমি একটি মার্জড স্ট্যাটিক লাইব্রেরি তৈরি করতে চাই।


7
এটিও দেখুন: libtoollibtool -static -o new.a old1.a old2.a
-ভিত্তিক

4
এটি নিখুঁতভাবে কাজ করে, যদি এই লাইব্রেরিগুলিতে সাধারণ ফাইল থাকে তবে কিছুটা সন্দেহ থাকে (তবে কার্যকারিতা অনুযায়ী তারা পৃথক হয়) এটি কি এখনও কাজ করবে?
বাইন্ডিংফিসাক

libtool -static -o new.a old1.a Old2.a লিনাক্সে কাজ করছেন না (সেন্টোস 7)

উত্তর:


60

আপনি উভয় .aফাইল থেকে অবজেক্টটি এক্সট্রাক্ট করতে পারবেন এবং .aএক্সট্রাক্ট .oগুলি ব্যবহার করে আপনার ফাইল তৈরি করতে পারেন :

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

63
বিপদ, উইল রবিনসন! এটি কেবল তখনই কাজ করে যদি libabc.a এবং libxyz.a এর সদস্যদের নাম ওভারল্যাপ না করে। অন্যথায় আপনি একটি ওভাররাইট করে ফেলবেন এবং এটি হারিয়ে যাবে।
ডেভিড

6
তদুপরি, libabc.aএকই নামযুক্ত বস্তু থাকতে পারে (উত্পন্ন রূপটি বিভিন্ন ডিরেক্টরি) - পুনরায় একত্রিতকরণ কাজ করবে না!
ইগোর আর।

17
ar -cআমার পক্ষে কাজ করেনি (উবুন্টু 14.04)। আমি পেয়েছি ar: no operation specifiedar -qcপরিবর্তে আমি করেছি এবং এটি ভাল কাজ করেছে।
সর্বোচ্চ

ar t lib.a লাইব্রেরিতে ফাইলগুলি দেখার জন্য আসলে ফাইলগুলি না বের করে ব্যবহার করা যেতে পারে।
raj_gt1

আমি কীভাবে অটোমেককে এটি করতে পারি?
শুভা

120

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

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

অন্য দুটি জিএনইউ আর ব্যবহার করার সময় অন্তত উপলব্ধ। আপনি একটি এমআরআই স্ক্রিপ্ট ব্যবহার করতে পারেন (উদাহরণস্বরূপ libas.mri নামকরণ করা), যেমন:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

এবং তারপরে আর কে কার্যকর করুন:

ar -M <libaz.mri

অথবা আপনি একটি পাতলা সংরক্ষণাগার (বিকল্প -T) ব্যবহার করতে পারেন , যা অন্য আর্কাইভগুলিকে ভিতরে বাসা না দিয়ে যোগ করার অনুমতি দেবে, যদিও ক্ষতির দিকটি হ'ল আপনি যদি স্থির লাইব্রেরি বিতরণ করতে চান তবে বিচ্ছিন্ন বস্তুটি অনুপস্থিত হবে:

ar -rcT libaz.a libabc.a libxyz.a

উপরের সমস্ত পদ্ধতিগুলি আর্কাইভস আসল সংরক্ষণাগার থেকে সদস্যদের ওভারল্যাপিং হ্যান্ডেলটি পরিচালনা করে।

অন্যথায়, ওভারল্যাপিং সদস্যের নামটি প্রতিস্থাপন এড়াতে আপনাকে বিভিন্ন ডিরেক্টরিতে প্যাক করতে এবং আবার পুনরায় শোধ করতে হবে:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

19
যাঁরা একটি সাধারণ সংরক্ষণাগার চান (পাতলা নয়) তাদের পক্ষে একটি সাধারণ জিনিস যা পাতলা সংরক্ষণাগার তৈরি করা হয়, তারপরে এটিকে একটি সাধারণ সংরক্ষণাগারে রূপান্তর করুন। ভালো কিছু: ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M। এটি একটি অস্থায়ী পাতলা তৈরি করে libaz.aএবং তারপরে পাতলা সংরক্ষণাগারটিকে একটি সাধারণ আকারে রূপান্তর করে (যাতে আপনি এটি সরান / বিতরণ করতে পারেন)। এটি যখন গ্রন্থাগারের নামগুলিতে বিশেষ অক্ষর (স্পেসড, প্লাসস বা কমা) থাকে (যেমন ar cqT libbundle.a libfoo++.a 'libbar baz.a') থাকে তখন কৌতূহলীভাবে পরিচালনা করে । তবে আমার কাছ থেকে +1!
কর্নস্টালস

প্রদত্ত প্রথম এমআরআই স্ক্রিপ্ট উদাহরণটির খারাপ দিকটি কী?
জেবি

চমৎকার উত্তর! এমন কয়েকটি বিকল্প দেখতে ভাল যা আপনাকে উত্তোলন এবং পুনরায় আহরণের প্রয়োজন হয় না। এছাড়াও আমি মনে করি @ কর্নস্টালকের ধারণাটি ভাল। উত্তরে যুক্ত হতে হবে?
লাইটবুলব 1

আরে যখন আমি libtoolএই ত্রুটিগুলি পাবার জন্য কমান্ডটি ব্যবহার করার চেষ্টা করি: libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag' কোনও সমাধান কীভাবে এটি সমাধান করতে হয়?
লার্স নীলসেন

@ গুলেম @ কর্নস্টালস দুর্দান্ত উত্তর। --Wl,-whole-archiveএকাধিক লিব * .এ এর জন্য মূল লিঙ্কিং কমান্ডে বিকল্পের প্রয়োজন হলে কী হবে এবং আমাকে সমস্ত লিবিব * .এ এর সাথে একত্রিত করতে হবে one.a। আবার লিঙ্ক করার সময়, সাথে --Wl,-whole-archiveকাজ করবে না one.a। আপনার পরামর্শ কি? stackoverflow.com/questions/56323197/...
thinkdeep

10

আপনি যদি এটি সহজভাবে করেন তবে:

ar x a.a
ar x b.a
ar c c.a  *.o 

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

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

আরও উল্লেখযোগ্য যে, একই সংরক্ষণাগারে একই নামের একাধিক সদস্য রয়েছেন ( আ-তে বলুন), আপনি যদি আর এক্স এএ চালান , আপনি একই নামের সেই সদস্যদের জন্য কেবল একজন পাবেন।

একটি সংরক্ষণাগারে একই নামের সমস্ত সদস্যকে বের করার একমাত্র উপায় হল 'N' বিকল্পের মাধ্যমে সদস্য সংখ্যাটি নির্দিষ্ট করা:

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

এটি একটি ক্লান্তিকর কাজ হবে, সুতরাং সেই কাজটি করার জন্য আপনাকে আরও পরিশীলিত স্ক্রিপ্ট লিখতে হবে।

একটি alচ্ছিক সমাধান হ'ল আপনি একাধিক সংরক্ষণাগারকে একটি ভাগ করা লাইব্রেরিতে সংযুক্ত করতে পারেন:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

এইভাবে লিঙ্কার আপনার জন্য সমস্ত জিনিস পরিচালনা করবে!


4
স্যামুয়েল, আপনাকে ধন্যবাদ। তবে ভাগ করা লাইব্রেরিতে একত্রিত করার সময়, সমস্ত বস্তুটি সংকলন করা উচিত -fPIC
osgx

0

আরও ভাল আপনি প্রতিটি লাইব্রেরিতে আংশিক লিঙ্কিং সম্পাদন করেন এবং সেগুলি দুটি ফলস্বরূপ অবজেক্ট ফাইলগুলির একটি সংরক্ষণাগার তৈরি করে। এইভাবে এটি ভাগ করা লাইব্রেরিগুলির মতো পরিচালনা করে

আপনি আংশিক সংযোগ সঙ্গে

gcc -r --nostdlib

সুতরাং হয় মধ্যবর্তী সংরক্ষণাগার তৈরির পরিবর্তে বা পুনরায় পাঠের পরে, চালান

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

তারপর

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o

এটি সত্যই জিজ্ঞাসিত প্রশ্নের উত্তর দিচ্ছে না - যেমন তিনি লাইব্রেরি চেয়েছিলেন। অনেক সময় আপনার কাছে প্রদত্ত লাইব্রেরির উত্সও নেই বা অন্য কারণে সেগুলি পূর্বনির্ধারিত রাখতে চান।
ফোলাট

0
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

এখন আপনার কাছে "ম্যাক্রোব্লক-১০.o" এর দুটি সংস্করণ রয়েছে


0
ar crsT libaz.a libabc.a libxyz.a

এখানে, আপনি সংরক্ষণাগারগুলির সংরক্ষণাগার তৈরি করেন এবং তারপরে টি পতাকা সহ 'সমতল' (পাতলা) ফলাফল। এটি একই নামের .o ফাইলগুলির সাথে কীভাবে কাজ করবে তা নিশ্চিত নয় within

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