2012-03-20 13 views
7

में संकलित करता है अब मैं सी ++ का अध्ययन कर रहा हूं। मैं एक मेकफ़ाइल चाहता हूं जो निष्पादन योग्य को अलग करने के लिए वर्तमान निर्देशिका में सभी सीपीपी फ़ाइलों को संकलित करेगा। उदाहरण के लिए:मेकफ़ाइल जो निर्देशिका में सभी सीपीपी फ़ाइलों को अलग निष्पादन योग्य

एक निर्देशिका में 3 C++ फ़ाइलें, जैसे examp1.cpp, examp2.cpp और examp3.cpp देखते हैं। मैं एक makefile जो संकलन और उन्हें लिंक और examp1.exe दे देंगे चाहते हैं, examp2.exe और examp3.exe

मैं एक bash स्क्रिप्ट बनाया है उन सभी को संकलन और व्यय बनाने के लिए लेकिन मुझे लगता है; ऐसा करने का यह सही तरीका नहीं है।

मेरे पास ".c" के लिए मेकफ़ाइल है, लेकिन ऐसा लगता है कि यह यहां काम नहीं करता है। यह केवल ऑब्जेक्ट फाइलें बना रहा है और वास्तव में इसे लिंक नहीं कर रहा है। यह इस प्रकार है:

SRCS=$(wildcard *.c) 
OBJS=(SRCS:.c=.o) 
all: $(OBJS) 

ऊपर कोड सभी नए और संशोधित "ग" वर्तमान निर्देशिका में एक ही नाम के साथ फ़ाइलों के लिए "ओ" फ़ाइलें संकलित करता है। "सभी कर" या कुछ भी, एक सरल का उपयोग करके

for i in ./*.cpp 
do 
    g++ -Wno-deprecated $i -o `basename $i .cpp`".exe" 
done 

इसका मतलब यह है मैं चाहता हूँ जो कुछ भी "सीपीपी" फ़ाइलें मुझे लगता है कि निर्देशिका में डाल दिया:

बैश स्क्रिप्ट मैं निष्पादनयोग्य बनाने के लिए उपयोग कर रहा हूँ इस प्रकार है जैसे कि इसे संकलित करना चाहिए।

all: examp1.exe examp2.exe examp3.exe 

कि के डिफ़ॉल्ट नियमों का उपयोग अपने तीन कार्यक्रमों को बनाने के लिए होगा:

+4

क्या आपने मेकफ़ाइल बनाने का प्रयास करने का कोई प्रयास किया है? यदि ऐसा है तो इसे पोस्ट करें ताकि हम आपकी मदद कर सकें। शुरू करने के लिए [प्रलेखन] (http://www.gnu.org/software/make/manual/make.html) उपलब्ध है। – Joe

+1

बनाने के संस्करण एक आपूर्तिकर्ता से दूसरे में भिन्न होते हैं। आप क्या उपयोग कर रहे हैं? क्या आप लिनक्स पर जीएनयू मेक का उपयोग कर रहे हैं? माइक्रोसॉफ्ट विंडोज/विजुअल सी ++ पर बनाओ? –

+1

क्या आपने एक मेकफ़ाइल लिखने का प्रयास किया है जो * एक * स्रोत फ़ाइल संकलित करेगा और निष्पादन योग्य होगा? – Beta

उत्तर

16

एक न्यूनतम Makefile करता है कि आप क्या होगा चाहते हैं:

#Tell make to make one .out file for each .cpp file found in the current directory 
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp)) 

#Rule how to create arbitary .out files. 
#First state what is needed for them e.g. additional headers, .cpp files in an include folder... 
#Then the command to create the .out file, probably you want to add further options to the g++ call. 
%.out: %.cpp Makefile 
    g++ $< -o [email protected] -std=c++0x 

आप संकलक आप उपयोग कर रहे और संभवतः कुछ मंच विशिष्ट सेटिंग को समायोजित द्वारा ++ जी को बदलने के लिए होगा, लेकिन Makefile ही काम करना चाहिए ।

+0

इस मेकफ़ाइल का उपयोग करके; उदाहरण के लिए यदि मेरे पास "hello.cpp" फ़ाइल है, तो मुझे "हैलो बनाने" का उपयोग करना होगा।बाहर ", लेकिन मैं पूछ रहा हूं कि क्या मैं" सब कुछ "का उपयोग" hello.cpp "को" hello.out "में संकलित कर दूंगा। यहां जब मैं उपरोक्त मेकफ़ाइल का उपयोग करता हूं तो मुझे" सभी के लिए कुछ भी नहीं किया जा रहा है " – kaushik

+0

क्या आपने कोशिश की है यह? xD यह दूसरी पंक्ति में निर्दिष्ट करता है कि सभी कमांड को निर्देशिका में मिली प्रत्येक .cpp फ़ाइल के लिए एक .out फ़ाइल की आवश्यकता होती है। इसलिए सभी को कॉल करने के लिए एक कॉल में परिणाम होगा, उदाहरण के लिए हैलो.आउट करें, अलविदा बनाएं .out, और इसी तरह से। निश्चित रूप से नियम लागू होने के बाद भी आप hello.out बनाने का उपयोग कर सकते हैं, लेकिन आपको – Haatschii

+0

ठीक नहीं है, ठीक है, एक बार फिर कोशिश करें, मैं $ (वाइल्डकार्ड * .cpp) डालना भूल गया सभी नियम। अब इसे उम्मीद के अनुसार काम करना चाहिए। – Haatschii

1

सरल makefile आपको लगता है कि आप के लिए काम कर सकते हैं बना सकते हैं यह है।

3

यह Makefile है कि मैं का उपयोग

CC = gcc 
CFLAGS = -g -O2 -std=gnu99 -static -Wall -Wextra -Isrc -rdynamic -fomit-frame-pointer 
all: $(patsubst %.c, %.out, $(wildcard *.c)) 
%.out: %.c Makefile 
    $(CC) $(CFLAGS) $< -o [email protected] -lm 
clean: 
    rm *.out      

आप अपने घर में कहीं पेस्ट करना चाहिए और जब भी आप dirctory बदल सिर्फ यह वहाँ की प्रतिलिपि है। मैं अपने ~/.basrc में एक अन्य नाम का उपयोग कॉपी करने के लिए यह

alias get_makefile_here='cp ~/Makefile ./' 

सीधे शब्दों में make और bam दबाते हैं, तो आपका काम हो गया। इस तथ्य को भी ध्यान दें कि एक बार जब आप पुराने फाइलों के साथ कर लेंगे तो यह उनके निष्पादन योग्य पुनर्निर्माण नहीं करेगा।

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