2012-10-17 12 views
8

मैं एक ऐप बनाना चाहता हूं और मेरे पास एकाधिक निर्देशिकाओं में संग्रहीत कई मॉड्यूल हैं। मैंने this विचार का पालन करने का निर्णय लिया है, यानी प्रत्येक निर्देशिका में मेकफ़ाइल बनाने के लिए और फिर इसे मर्ज करने के लिए। लेकिन - एक शुरुआती प्रोग्रामर के रूप में - मुझे अभी भी यह नहीं दिख रहा है कि यह कैसे करें। सबसे पहले, इस तरह के "आंशिक" मेकफ़ाइल कैसा दिखेंगे। उनके पास मुख्य कार्य नहीं हो सकता है क्योंकि केवल बाइनरी प्रति एक हो सकता है, हालांकि जब मैं इसे संकलित करने का प्रयास करता हूं तो मुख्य के अनिर्धारित संदर्भ के लिए जीसीसी शिकायत करता है। दूसरा, मुझे नहीं पता कि उन सभी मॉड्यूल को एक साथ कैसे दिखाना होगा।कई निर्देशिकाओं में मेकफ़ाइल

मैं किसी भी मदद की सराहना करता हूं, लेकिन कृपया अपने उत्तरों को सरल रखने की कोशिश करें। मेकफ़ाइल अभी भी मेरे लिए काले जादू का थोड़ा सा है।

+0

[विभिन्न निर्देशिकाओं में स्रोत फ़ाइलों के साथ मेकफ़ाइल] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1139271/makefiles-with-source-files-in- अलग- निर्देशिकाएं) –

उत्तर

25

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

चूंकि आप जीसीसी का उपयोग कर रहे हैं, तो मुझे लगता है कि आपका स्रोत कोड सी ++ है।

आपने हमें बताया नहीं है कि आपकी निर्देशिका संरचना कैसी दिखती है, इसलिए मुझे लगता है कि आपके पास दो निर्देशिकाओं में तीन स्रोत फ़ाइलें हैं: primary/main.cc, other/foo.cc और other/bar.cc। (हम बाद में foo.h जैसे हेडर फ़ाइलों से निपट सकते हैं।) और आप myApp बनाना चाहते हैं।

कदम 1: यह

कर करके हाथ एक आदेश में ऐसा करने के लिए, आप उपयोग कर सकते हैं:

gcc -Wall primary/main.cc other/foo.cc other/bar.cc -o myApp 

इस तीन स्रोत फ़ाइलें संकलन होगा और बाइनरी वस्तुओं में एक साथ लिंक निष्पादन योग्य myApp

कदम 2: यह टुकड़े में कर के बजाय एक आदेश के साथ निर्माण की (। इस प्रयास नहीं जब तक आप पूरी तरह से काम करने के लिए पिछले चरण प्राप्त कर सकते हैं करें)

, आप एक मध्यवर्ती चरण ले सकता है, संकलन द्विआधारी वस्तु फाइलों में स्रोत फ़ाइलें:

gcc -Wall -c primary/main.cc -o primary/main.o 
gcc -Wall -c other/foo.cc -o other/foo.o 
gcc -Wall -c other/bar.cc -o other/bar.o 

यह alpha/main.o, beta/foo.o और beta/bar.o का उत्पादन करेगा। संकलक, के बारे में foo और bar एक main() समारोह की कमी की शिकायत नहीं करेगा क्योंकि एक वस्तु फ़ाइल एक जरूरत नहीं है। फिर एक निष्पादन में एक साथ वस्तुओं लिंक:

gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp 

कदम 3: यह कर स्थानीय स्तर पर (यह प्रयास न करें जब तक आप पूरी तरह से काम करने के लिए पिछले चरण प्राप्त कर सकते हैं।)

वैसे ही जैसे पिछले चरण, लेकिन हम primary/ और other/ में कार्य:

cd primary 
gcc -Wall -c main.cc -o main.o 
cd ../other 
gcc -Wall -c foo.cc -o foo.o 
gcc -Wall -c bar.cc -o bar.o 
cd .. 
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp 

चरण 4: एक Makefile (का उपयोग करते हुए इस प्रयास न करें जब तक आप पूरी तरह से काम करने के लिए पिछले चरण प्राप्त कर सकते हैं।)

हम एक makefile कदम 1 प्रदर्शन हो सकता है, लेकिन वास्तव में आवश्यक नहीं है। primary में एक makefile लिखें (अर्थातprimary/makefile) इस तरह:।

main.o: 
    gcc -Wall -c main.cc -o main.o 

(gcc... की fromt में यही खाली स्थान के एक टैब है)

अब इस प्रयास करें:

cd primary 
make 
cd ../other 
gcc -Wall -c foo.cc -o foo.o 
gcc -Wall -c bar.cc -o bar.o 
cd .. 
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp 

कदम 5: कई Makefiles का उपयोग करना (न करें इसे तब तक प्रयास करें जब तक कि आप पूरी तरह से काम करने के लिए पिछले चरण को प्राप्त नहीं कर सकते।)

other/makefile लिखें:

both: foo.o bar.o 

foo.o: 
    gcc -Wall -c foo.cc -o foo.o 

bar.o: 
    gcc -Wall -c bar.cc -o bar.o 

और शीर्ष निर्देशिका है, जहां आप myApp निर्माण कर रहे हैं में एक makefile:

myApp: 
    gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp 

अब इस प्रयास करें:

cd primary 
make 
cd ../other 
make 
cd .. 
make 

कदम 6: एक Makefile दूसरों को कॉल का प्रयोग (जब तक आप पूरी तरह से काम करने के लिए पिछले चरण प्राप्त नहीं कर लेते तब तक इसका प्रयास न करें।)

संपादित शीर्ष makefile:

myApp: 
    cd primary; make 
    cd other; make 
    gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp 

अब कोशिश:

make 

तो यह सब काम करता है, तुम्हारे पास क्या है एक कच्चे लेकिन प्रभावी makefile प्रणाली है। जब आप प्रशिक्षण पहियों को बंद करने के लिए तैयार होते हैं, तो कई परिशोधन संभव होते हैं।

संपादित करें:

उप-निर्देशिका (जैसे other/) में कई स्रोत फ़ाइलों देखते हैं और आप हाथ से शीर्ष makefile में एक सूची बनाए रखने के लिए नहीं करना चाहते हैं, वहाँ इसे संभाल करने के लिए कई तरीके हैं। यह एक है:

OTHER_SOURCES := $(wildcard other/*.cc) 

OTHER_OBJECTS := $(OTHER_SOURCES:.cc=.o) 

myApp: 
    cd primary; make 
    cd other; make 
    gcc -Wall primary/main.o $(OTHER_OBJECTS) -o myApp 

लेकिन आपको इन मेकफ़ाइलों को काम करने और समझने से पहले, और अधिक सुव्यवस्थित करने की कोशिश करने से पहले उन्हें समझना चाहिए।

+0

उत्कृष्ट ट्यूटोरियल के लिए धन्यवाद! क्या होगा यदि मेरे पास प्रति मॉड्यूल निर्देशिका में वास्तव में बड़ी मात्रा में फ़ाइलें हैं? यह 6 वें चरण की आखिरी पंक्ति लिखने के लिए वास्तव में परेशान हो सकता है। क्या इसके लिए कोई कामकाज है? सभी .o फ़ाइलों को एक प्रति निर्देशिका में विलय करने या किसी दिए गए निर्देशिका से सभी .o फ़ाइलों को प्राप्त करने के लिए मेकफ़ाइल के भीतर कहने की तरह? – yauser

+0

आप निर्देशिका को बदलने और उस निर्देशिका में मेकफ़ाइल पढ़ने के लिए (मेकफ़ाइल के अंदर) बनाने के लिए '-C' भी उपयोग कर सकते हैं। – Aif

+0

@Aif: हाँ, मैं '-C' का उपयोग करता हूं, लेकिन मैं चीजों को आदिम रखने की कोशिश कर रहा था। जैसा कि मैंने कहा, कई परिशोधन संभव हैं। (और मैंने सुना है कि '-C' वास्तव में POSIX-compliant नहीं है ...) – Beta

संबंधित मुद्दे