जी ++ के साथ एक स्थिर पुस्तकालय कैसे बनाएं?


101

क्या कोई मुझे बता सकता है कि एक .cpp और .hpp फ़ाइल से एक स्थिर पुस्तकालय कैसे बनाया जाए? क्या मुझे .o और .a बनाने की आवश्यकता है? मैं यह भी जानना चाहूंगा कि मैं एक स्थैतिक पुस्तकालय को कैसे संकलित कर सकता हूं और इसे अन्य .cpp कोड में उपयोग कर सकता हूं। मेरे पास है header.cpp, header.hpp .मैं बनाना चाहूंगा header.a। शीर्ष लेख का परीक्षण करें test.cpp। मैं संकलन के लिए g ++ का उपयोग कर रहा हूं।


3
क्या आप कृपया @ नीलब्रतवर्थ के उत्तर (या अन्य एक) को स्वीकार कर सकते हैं?
22p में einpoklum

जवाबों:


111

एक .o फ़ाइल बनाएँ:

g++ -c header.cpp

यदि आवश्यक हो, तो लाइब्रेरी में इस फ़ाइल को लाइब्रेरी में जोड़ें:

ar rvs header.a header.o

पुस्तकालय का उपयोग करें:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test, नहीं?
linuxx

11
@unapersson: क्यों? निष्पादन योग्य प्रारूप में नहीं है a.outइसलिए यह अत्यधिक भ्रामक है। और आपको "कभी नहीं" नामक एक निष्पादन योग्य क्यों बनाना चाहिए test?
को ऑर्बिट में लाइटनेस दौड़

5
@Tomalak Geret'kal: मुझे लगता है कि यह इस तथ्य के साथ करना है कि testसिस्टम कमांड है। लेकिन चूंकि परीक्षण कार्यक्रम आमतौर पर सिस्टम बिन निर्देशिका में कभी भी स्थापित नहीं होते हैं और आपको ./testयह लिखने की आवश्यकता होती है कि यह मेरे लिए इतनी समस्या नहीं है ...
ereOn

10
@unapersson: नहीं, मैं वही कह रहा हूं जो मैंने कहा था। निष्पादनयोग्य अब a.outप्रारूप में निर्मित नहीं होते हैं , लेकिन नाम विरासत के कारणों से बना हुआ है। (और अगर आपको लगता है कि आपकी समस्या का ठीक से तो एक खोल का उपयोग करने का कर रहे हैं असमर्थ;। एक पता है कि वर्तमान निर्देशिका से एक निष्पादन योग्य को चलाने के लिए कैसे के लिए मैं 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 

2
और lib / libHeader.a के साथ क्या है? ar rcs ... क्या यह ar crf से बेहतर नहीं है?
linuxx

1
@linuxx: main.o वह ऑब्जेक्ट फ़ाइल होगी जिसे आप main.cc से बनाते हैं
श्रीराम

@linuxx: सही उपयोगिता के साथ आपके द्वारा उपयोग किए जाने वाले सही झंडे आपकी आवश्यकताओं के आधार पर आपका निर्णय हैं। मैन पेज को ar के लिए देखना एक अच्छा विचार होगा।
श्रीराम

कैसे test.cpp का उपयोग कर पुस्तकालय का परीक्षण करने के लिए?
लिनक्सक्स

19
-lHeaderइसके बजाय नहीं होगा -llibHeader?
Dolanor

30

क्या कोई मुझे बता सकता है कि एक .cpp और .hpp फ़ाइल से एक स्थिर पुस्तकालय कैसे बनाया जाए? क्या मुझे .o और the .a बनाने की आवश्यकता है?

हाँ।

(। सामान्य के अनुसार) बनाएँ :

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

फिर भी, मैं आपको इस संदेह का लाभ दूंगा कि आपका वास्तविक उपयोग मामला अधिक जटिल है, जिसमें अधिक मॉड्यूल हैं।

उम्मीद है की यह मदद करेगा!


1
हम कई मॉड्यूल कैसे शामिल करते हैं?
सिधिन एस थॉमस

2
अच्छा था! कभी-कभी हम देखते हैं ranlibकि GNU का मतलब क्या होता है ar s
वियत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.