জি ++ দিয়ে স্ট্যাটিক লাইব্রেরি কীভাবে তৈরি করবেন?


103

কেউ দয়া করে আমাকে বলতে পারেন কীভাবে একটি .cpp এবং একটি .hpp ফাইল থেকে একটি স্ট্যাটিক লাইব্রেরি তৈরি করবেন? আমার .o এবং .a তৈরি করার দরকার আছে? আমি আরও জানতে চাই যে কীভাবে আমি স্থির গ্রন্থাগারটি সংকলন করতে পারি এবং এটি অন্য .cpp কোডে ব্যবহার করতে পারি। আমার আছে header.cpp, header.hpp .আমি তৈরি করতে চাই header.a। মধ্যে header.a পরীক্ষা করুন test.cpp। সংকলনের জন্য আমি জি ++ ব্যবহার করছি।

উত্তর:


113

একটি .o ফাইল তৈরি করুন:

g++ -c header.cpp

এই ফাইলটি একটি লাইব্রেরিতে যুক্ত করুন, প্রয়োজনে গ্রন্থাগার তৈরি করুন:

ar rvs header.a header.o

গ্রন্থাগার ব্যবহার করুন:

g++ main.cpp header.a

4
g ++ test.cpp header.a -o পরীক্ষা, না?
লিনাক্সেক্স

11
@ ইউনপারসন: কেন? এক্সিকিউটেবল হয় নাa.outতাই এই অত্যন্ত বিভ্রান্তিকর হয় বিন্যাস। এবং কেন আপনি "কখনই" ডাকা হবে না এক্সিকিউটেবল বলা test?
অরবিটে মেঘের হালকাতা রেস

4
@ তোমালাক গেরিট'কাল: আমার ধারণা, এটি testসিস্টেম কমান্ডের সাথে সম্পর্কযুক্ত । তবে যেহেতু টেস্ট প্রোগ্রামগুলি সাধারণত সিস্টেম বিন ডিরেক্টরিতে ইনস্টল করা হয় না এবং আপনার এটি লেখার ./testপ্রয়োজন হয় তাও আমার পক্ষে তেমন সমস্যা নয় ...
ereOn

10
@ ইউনপারসন: না। আমি যা বলেছিলাম ঠিক তাই বলছি। এক্সিকিউটেবলগুলি আর a.outবিন্যাসে উত্পাদিত হয় না , তবে নামটি উত্তরাধিকারগত কারণে রয়ে যায় remains (এবং যদি আপনি যে আপনার সমস্যা সঠিকভাবে তারপর একটি শেল ব্যবহার নির্মাণ করে চলেছি অসমর্থ;। এক জানেন বর্তমান ডিরেক্টরি থেকে একটি এক্সিকিউটেবল চালানোর জন্য কিভাবে আমি testহয় শুধু জরিমানা একটি এক্সিকিউটেবল নামের জন্য যতদিন না পর্যন্ত আপনি যেমন হন, লেখা শুধু একটি দ্রুত পরীক্ষা অবশ্যই স্নিপেট।)
অরবিট

4
এক্সিকিউটেবলের নামকরণ testএমন কিছু যা আমি অনুশোচনা করার কঠিন উপায় শিখেছি এবং আমি "শেল ব্যবহারে পুরোপুরি সক্ষম"। এটি একটি খারাপ ধারণা, এবং আমি এটি "শেল ব্যবহারে পুরোপুরি সক্ষম" এমন আরও অনেককে কামড় দিয়ে দেখেছি।
রাষ্ট্রপতি জেমস কে। পোলক

47

আপনি ইউটিলিটি .aব্যবহার করে একটি ফাইল তৈরি করতে পারেন ar, যেমন:

ar crf lib/libHeader.a header.o

libএমন একটি ডিরেক্টরি যা আপনার সমস্ত লাইব্রেরি ধারণ করে। আপনার কোডটি এভাবে সাজানো এবং কোড এবং অবজেক্ট ফাইলগুলি পৃথক করা ভাল অনুশীলন। একটি ডিরেক্টরিতে সবকিছু থাকা সাধারণত কুশ্রী লাগে। উপরের লাইনটি libHeader.aডিরেক্টরিতে তৈরি করে lib। সুতরাং, আপনার বর্তমান ডিরেক্টরিতে, করুন:

mkdir lib

তারপরে উপরের arকমান্ডটি চালান ।

সমস্ত লাইব্রেরি লিঙ্ক করার সময়, আপনি এটি এর মতো করতে পারেন:

g++ test.o -L./lib -lHeader -o test  

-Lপতাকা পাবেন g++যোগ করার জন্য lib/পথে ডিরেক্টরি। এই পদ্ধতিতে, g++অনুসন্ধানের সময় কোন ডিরেক্টরিটি অনুসন্ধান করতে হবে তা জানেন libHeader-llibHeaderলিঙ্ক করতে নির্দিষ্ট লাইব্রেরি পতাকা।

যেখানে test.o এর মতো তৈরি করা হয়েছে:

g++ -c test.cpp -o test.o 

4
এবং lib / libHeader.a এর সাথে কী আছে? আর আরসিএস ... এটি আর ক্রফের চেয়ে ভাল না?
লিনাক্সেক্স

4
@ লিনাক্সেক্স: মেইন.ও আপনি মূল সি.সি. থেকে তৈরি করেছেন এমন বস্তু ফাইল হবে
শ্রীরাম

@ লিনাক্সেক্স: আপনি আর ইউটিলিটির সাথে সঠিক পতাকাগুলি ব্যবহার করেন তা আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনার সিদ্ধান্ত। আর এর জন্য ম্যান পেজগুলি সন্ধান করা ভাল ধারণা হবে।
শ্রীরাম

test.cpp ব্যবহার করে লাইব্রেরি কীভাবে পরীক্ষা করবেন?
লিনাক্সেক্স

19
এর -lHeaderবদলে হবে না -llibHeader?
ডোলানর

30

কেউ দয়া করে আমাকে বলতে পারেন কীভাবে একটি .cpp এবং একটি .hpp ফাইল থেকে একটি স্ট্যাটিক লাইব্রেরি তৈরি করবেন? আমার .o এবং .a তৈরি করার দরকার আছে?

হ্যাঁ.

.O (সাধারণ হিসাবে) তৈরি করুন :

g++ -c header.cpp

সংরক্ষণাগারটি তৈরি করুন :

ar rvs header.a header.o

পরীক্ষা :

g++ test.cpp header.a -o executable_name

মনে রাখবেন যে এতে একটি মাত্র মডিউল রেখে একটি সংরক্ষণাগার তৈরি করা কিছুটা অর্থহীন বলে মনে হচ্ছে। আপনি ঠিক যেমন লিখতে পারতেন:

g++ test.cpp header.cpp -o executable_name

তবুও, আমি আপনাকে প্রকৃত ব্যবহারের ক্ষেত্রেটি আরও মডিউল সহ কিছুটা জটিল বলে সন্দেহের সুবিধা দেব।

আশাকরি এটা সাহায্য করবে!


4
কীভাবে আমরা একাধিক মডিউল অন্তর্ভুক্ত করব?
সিধিন এস টমাস

4
ভাল একটা! কখনও কখনও আমরা ranlibজিএনইউতে এর সহজ অর্থ বোঝায় ar s
ভিয়েতনাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.