2009-03-01 15 views
16

दोस्तों में मेकफ़ाइल से स्थैतिक/गतिशील पुस्तकालयों तक एक प्रोजेक्ट बनाना, क्या आप यूनिक्स पर सी ++ बिल्डिंग ब्लॉक के बारे में कुछ चीजों का वर्णन करेंगे।यूनिक्स

मैं एक ऐसा एप्लिकेशन बनाना चाहता हूं जो स्थैतिक libs और गतिशील libs (.so) के खिलाफ लिंक करता है।

प्रश्न 1:मैं जीसीसी/जी ++ का उपयोग करके स्थिर पुस्तकालय कैसे बना सकता हूं? मैं इसके खिलाफ अपना ऐप लिंक कैसे बना सकता हूं।

प्रश्न 2:कैसे makefile में यह निर्दिष्ट करने के लिए, स्थिर और गतिशील libs रूप से लिंक हो, यह सोचते हैं कि दोनों पुस्तकालयों फ़ाइलों

सारांश शीर्षक है: मैं साल के लिए makefiles और पुस्तकालयों का उपयोग किया गया, किसी और ने लिखा है। इस प्रकार हर बार जब मैंने इसे संशोधित किया, तो मैंने वास्तव में इसे समझने के बिना चीजों को काटकर चिपकाया। अब मैं जमीन पर उतरना चाहता हूं और बिल्डिंग/लिंकिंग/गफाइल प्रक्रिया को गहराई से समझना चाहता हूं।

घनिष्ठ विवरणों में इन अवधारणाओं का वर्णन करने वाली एक अच्छी किताब क्या है?

धन्यवाद

उत्तर

15

स्टेटिक पुस्तकालयों आमतौर पर ar कमांड के साथ संग्रहीत कर रहे हैं। एक बार जब आप वस्तु फ़ाइलों के सभी निर्माण (अधिमानतः जीसीसी पर -fPIC स्विच के साथ), आप ar इसलिए की तरह चला सकते हैं:

ar -rs archivename.a list.o of.o objects.o 

man पेज विकल्पों का वर्णन करता।

गतिशील पुस्तकालयों gcc या ld करने के लिए -shared स्विच और एक .so विस्तार के साथ आउटपुट फ़ाइल नाम के साथ आम तौर पर बनाया जाता है।

Autotools libtool प्रोग्राम के साथ इसे संभालता है। मैं इसके उपयोग से परिचित नहीं हूं।

इन पुस्तकालयों के खिलाफ लिंक करने पर किसी -l (ell) स्विच के साथ पुस्तकालयों सूचीबद्ध करके या उन्हें सीधे (जैसे आपका आदेश को /usr/lib/libX.so जोड़ना) को निर्दिष्ट निरपेक्ष पथ के साथ (जैसे -lX रूप libX.so से जोड़ने के लिए) किया जा सकता है। स्टेटिक लाइब्रेरी -static-l से पहले या .a संग्रह के लिए उचित पूर्ण पथ निर्दिष्ट करके जुड़े हुए हैं। कोई एप्लिकेशन baz.cpp के लिए

PROJECT = library.a 
OBJECTS = foo.o bar.o 
CFLAGS = -Wall -pedantic 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) 
     libtool -o $(PROJECT) -static $(OBJECTS) 

नंगे हड्डियों Makefile कि स्थिर लिंक्स library.a लिए: foo.cpp में कोड से मिलकर एक स्थिर पुस्तकालय, bar.cpp बनाने के लिए

10

नंगे हड्डियों Makefile

PROJECT = baz 
CFLAGS = -Wall -pedantic 
OBJECTS = baz.o 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) library.a 
     g++ $(OBJECTS) -L. -llibrary -o $(PROJECT) 

गतिशील लाइब्रेरी बाएं, अहम, पाठक के लिए एक अभ्यास के रूप में।

+0

क्या जीसीसी में -c झंडा है। हेडर फ़ाइल के बारे में क्या? –

+0

भी, $ <मतलब, सभी सीपीपी फाइलें करता है? आपको इस मामले की आवश्यकता क्यों है। cpp.o: g ++ -c $ (CFLAGS) $ <इसे कहीं भी नहीं कहा जाता है? धन्यवाद –

+0

-c का मतलब संकलन है लेकिन लिंक नहीं है। $ <विस्तार के बिना फ़ाइल का नाम है। जीसीसी के लिए मैन पेज देखें, मेक करें। हेडर फ़ाइलों में मेकफ़ाइल में कोई स्थान नहीं है, जब तक कि वे निर्भरता न हों। –

2

उत्तर 1: स्रोत फ़ाइलों foo.c और बार से स्थिर लाइब्रेरी बनाने के लिए।ग, ऐसा करते हैं:

gcc -c foo.c 
gcc -c bar.c 
ar rc mylibrary.a foo.o bar.o 

इस बारे में अधिक जानकारी के लिए कैसे संकलक, और संकलक के माध्यम से लिंकर उपयोग करने के लिए सीखने के लिए GCC manual मैनुअल पढ़ें। binutils manual भी सहायक होना चाहिए।

उत्तर 2: GNU Make manual सुंदर अच्छा है। वास्तव में पुस्तकालयों के बारे में जानने के लिए और वे कैसे काम करते हैं, लिंकर्स और लोडर जॉन आर लेविन द्वारा पुस्तक पढ़ें।

स्टेटिक लाइब्रेरीज़ बहुत ही सरल हैं, लेकिन प्लेटफार्म पर और पोर्टेबिलिटी की मात्रा और आवश्यकता के आधार पर साझा लाइब्रेरी बहुत बालों वाली हो सकती हैं। उदाहरण के तौर पर, पर कुछ सिस्टम स्थिर और साझा पुस्तकालयों को अलग-अलग विकल्पों के साथ संकलित किया जाना चाहिए ठीक से काम करने के लिए (एक और अन्य को स्वतंत्र स्थिति कोड के साथ संकलित नहीं किया जाना चाहिए)। इस आसान (libtool), बनाने के लिए उपयोगिताओं के पूरे ढांचे को विकसित किया गया है, लेकिन वे खुद को असंवेदनशील नहीं हैं।

0

चूंकि आप जीसीसी का उल्लेख करते हैं, मुझे लगता है कि आप जीएनयू मेक का उपयोग कर रहे हैं। इसके लिए मैंने पाया है कि सबसे अच्छा प्रलेखन official manual है, जिसमें आसानी से समझने वाले शब्दों में आपको जो कुछ भी जानने की आवश्यकता है, वह शामिल है।

0

जब मैं लिनक्स प्रोग्रामिंग के बारे में सीख रहा था, Advanced Linux Programming ने मुझे बहुत मदद की। आप this pdf में लेखन और पुस्तकालय अनुभाग का उपयोग कर सकते हैं। यह लिनक्स में पुस्तकालयों के बारे में काफी कुछ बताता है।

+1

यह एक बहुत अच्छी किताब है, लेकिन मैं मेकफ़ाइल के साथ संयोजन में कुछ पसंद करता हूं। –