2009-08-14 11 views
6

में वस्तु फ़ाइलों के लिए निर्देशिका निर्दिष्ट यहाँ मेरी दो प्रश्न हैं:परियोजना को संगठित करने और Makefile

  1. मैं अब सीवीएस के साथ अपने कोड के प्रबंधन के लिए सीख रहा हूँ, और मैं सिर्फ अपनी सी ++ फ़ाइलों के लिए भंडार बनाना चाहते, मेकफ़ाइल और बैश और पायथन स्क्रिप्ट केवल ऑब्जेक्ट फ़ाइलें और निष्पादन योग्य नहीं हैं। इसलिए मैंने अपनी प्रोजेक्ट निर्देशिका के तहत कई उप-निर्देशिकाएं बनाई: src, bin, स्क्रिप्ट, परिणाम और डेटा। मैंने सी /+ फाइलें और मेकफ़ाइल ~/myproject/src, bash और पायथन स्क्रिप्ट के तहत ~/myproject/स्क्रिप्ट्स और ऑब्जेक्ट और एक्जिक्यूटिवल्स ~/myproject/bin के अंतर्गत रखी हैं। मुझे उम्मीद है कि केवल सीआरएस के माध्यम से स्रोत और स्क्रिप्ट के तहत फाइलें अपडेट की जाएंगी। मुझे आश्चर्य है कि आप कैसे अपनी परियोजनाओं को व्यवस्थित करते हैं? बस कुछ अच्छी आदतों का पालन करने की उम्मीद है

  2. चूंकि मैंने अपनी सी ++ फाइलें और मेकफ़ाइल ~/myproject/src और ऑब्जेक्ट और निष्पादन योग्य फ़ाइलों को ~/myproject/bin में डाल दिया है, तो मुझे मेकफ़ाइल में निर्देशिका निर्दिष्ट करना होगा।

    ... 
    BIN_DIR=/home/myproject/bin/ 
    
    all: $(BIN_DIR)myexecutable TAGS 
    
    TAGS: *.cc *.h 
        etags --members --declarations -l c++ *.cc *.h 
    
    $(BIN_DIR)myexecutable: $(BIN_DIR)myobject.o 
        $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 
    
    Makefile.depend: *.h *.cc Makefile 
        $(CXX) -M $(CXXFLAGS) *.cc > Makefile.depend 
    
    clean: 
        \rm -f $(BIN_DIR)myexecutable $(BIN_DIR)*.o Makefile.depend TAGS` 
    

    हालांकि इस त्रुटि दे देंगे

    मेकअप:: *** कोई नियम बनाने के लिए लक्ष्य /home/myproject/bin/myobject.o', needed by/घर/MyProject/bin यहाँ मैं क्या कर रहा हूँ

Makefile है/myexecutable '।

मेकफ़ाइल में सी ++ फ़ाइलों से ऑब्जेक्ट और निष्पादन योग्य फ़ाइलों के लिए एक अलग निर्देशिका निर्दिष्ट करने के लिए कैसे?

धन्यवाद और सम्मान!

+1

चार रिक्त स्थान द्वारा Makefile से अपने अंश को इंडेंट करें। यह उचित स्वरूपण और वाक्यविन्यास हाइलाइटिंग देगा। –

+0

ऐसा लगता है कि कहीं भी एक बग है जो सूची के बाद कोड डालने से रोकती है। मैंने "मेकफ़ाइल:" को एक काम के रूप में जोड़ा है। – AProgrammer

उत्तर

2
  1. आप यदि चाहें तो अलग निर्देशिका में अपनी फ़ाइलों को रख सकते हैं, लेकिन यह आवश्यक नहीं है। एक बार सीवीएस भंडार में एक फ़ाइल या निर्देशिका जोड़ें, और सीवीएस इसे अनिश्चित काल तक बनाए रखेगा। तब से आप इसे अपडेट कर सकते हैं, इसे जांच सकते हैं, जो भी हो। यदि आप रिपॉजिटरी में कोई ऑब्जेक्ट फ़ाइल नहीं जोड़ते हैं, तो सीवीएस इसे छू नहीं पाएगा। यदि आप एक संपूर्ण निर्देशिका पेड़ जोड़ना चाहते हैं, और आप वहां वस्तुओं को रखने की आदत में हैं, तो बस इसे करने से पहले साफ करें।

  2. मेक एक अद्भुत उपकरण है, लेकिन यह कुछ स्पष्ट दोष है। क्या आप का वर्णन कर रहे हैं क्लासिक समस्याओं में से एक है: एक स्रोत का उपयोग कर यहाँ कुछ बनाने के लिए अच्छा है, लेकिन आसपास नहीं अन्य तरीके से। आप जो करने की कोशिश कर रहे हैं, उसे करने के कुछ तरीके यहां दिए गए हैं।

ए) भागो अपने द्विआधारी निर्देशिका में बनाने:

 
    ... 
    all: myexecutable TAGS 

    myexecutable: myobject.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 

    VPATH = /home/myproject/src 
    ... 

सीडी ~/MyProject/bin
../src/makefile

बी -f बनाने) रखो बिन निर्देशिका पर वस्तुओं जानवर बल द्वारा:

 
    $(BIN_DIR)%.o: %.cc 
     $(CXX) $(CXXFLAGS) -c -o [email protected] $^ 

यह आपको Makefile.depend के साथ एक समस्या देगा, जो आप कई तरीकों से संपर्क कर सकते हैं।

सी) कुछ और अधिक उन्नत बनाने की तकनीक जानें। आपको शायद अभी तक यह कोशिश नहीं करनी चाहिए।

+0

यदि आपने दृष्टिकोण बी अपनाया है, तो आप मेकफ़ाइल निर्भरताओं के साथ समस्याओं का कैसे संपर्क करेंगे? – frankster

+0

@ फ्रैंकस्टर, मैं ऑब्जेक्ट फ़ाइलों के नाम पर '$ (BIN_DIR)' प्रीपेन्ड करने के लिए शायद 'Makefile.depend' कमांड' को संशोधित करता हूं। एक छोटा सा sed होगा। – Beta

2
  1. आपकी निर्देशिका संरचना समझ में आता है।

  2. मैं संकलक को क्रियान्वित करने के लिए एक स्पष्ट नियम बनाना होगा, जैसे

TARGET_DIR=bin 
SRC_DIR=src 
CXX=g++ 
CXXFLAGS= 
ETC= 

OBJS=$(TARGET_DIR)/test.o 

all: $(OBJS) 

$(TARGET_DIR)/%.o: $(SRC_DIR)/%.cc 
     $(CXX) -c -o [email protected] $(CXXFLAGS) $(ETC) $< 
+0

मैं डाउनवोट के बारे में एक टिप्पणी की सराहना करता हूं, ताकि मैं खुद को सुधार सकूं :) –

+0

पता नहीं कि आपको किसने वोट दिया, मुझे नहीं। :) यदि आपके पास कई .cc फ़ाइलें हैं, तो प्रत्येक ऑब्जेक्ट फ़ाइल के लिए नियम निर्दिष्ट करने के लिए यह कठिन है, है ना? – Tim

+0

नियम सामान्य है, इसलिए यह किसी भी .cc-file पर लागू होता है। मैंने लक्ष्य ऑब्जेक्ट्स की सूची के साथ मेकफ़ाइल-कोड उदाहरण अपडेट किया है। बस अतिरिक्त .o-files निर्दिष्ट करें, और उन्हें एक ही नियम के साथ संकलित किया जाएगा। –

-5

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

+0

प्रश्न का उत्तर नहीं देता है। – murrekatt

0

अपनी परियोजना के निर्माण के लिए automake और autoconf का उपयोग करें।

फ़ाइलों की संरचना के लिए बस किसी भी बड़े ओपन-सोर्स सी ++ एप्लिकेशन को देखें। किसी भी केडीई अनुप्रयोग उस मामले के लिए ठीक काम करेगा। यदि आपको कोई ऐसा एप्लिकेशन मिलता है जो सी ++ और पायथन का उपयोग करता है तो भी बेहतर होता है।

8

यदि आप बनाना सीखना चाहते हैं, तो GNU make manual संदर्भ और ट्यूटोरियल दोनों के रूप में बहुत अच्छा है। आप patsubst कमांड का उपयोग करने पर विचार करना चाहेंगे।पीछा कर रहा है यह का उपयोग करता है अपने ही makefiles में से एक की एक नीचे कटा हुआ संस्करण:

OUT = bin/csvfix.exe 
CC = g++ 
IDIR = inc 
ODIR = obj 
SDIR = src 
INC = -Iinc -I../alib/inc 
LIBS = ../alib/lib/alib.a -lodbc32 

_OBJS = csved_atable.o \ 
     csved_case.o \ 
     csved_cli.o \ 
     csved_command.o \ 
     csved_date.o \ 

OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS)) 

$(ODIR)/%.o: $(SDIR)/%.cpp 
    $(CC) -c $(INC) -o [email protected] $< $(CFLAGS) 

$(OUT): $(OBJS) 
    $(CC) -o [email protected] $^ $(CFLAGS) $(LIBS) 
    strip $(OUT) 

clean: 
    rm -f $(ODIR)/*.o $(OUT) 
संबंधित मुद्दे