2011-05-10 17 views
46

तेजी से सरल सवाल है लेकिन मैं मेकफ़ाइल के लिए नया हूं और एक मेकफ़ाइल बनाने की कोशिश कर रहा हूं जो दो स्वतंत्र कार्यक्रमों को संकलित करेगा। ऑनलाइन सभी उदाहरणों की आवश्यकता के मुकाबले ज्यादा जानकारी मिलती है और भ्रमित हो रही है!कई सी प्रोग्राम संकलित करने के लिए मेकफ़ाइल?

मैं निम्नलिखित है:

program1: 
    gcc -o prog1 program1.c 

program2 
    gcc -o prog2 program2.c 

सभी मैं वास्तव में यह करने के लिए चाहते हैं दो जीसीसी लाइनों को चलाने के लिए है। मैं क्या गलत कर रहा हूं?

+1

जवाब bellow बहुत स्पष्ट हैं, लेकिन आप भी सिर्फ कमांड लाइन चला सकते हैं: 'program1 program2' बनाने जो आपके द्वारा दिए गए उदाहरण में दोनों लक्ष्यों का आह्वान करेगा। यदि आप सिर्फ 'प्रोग्राम 1' चाहते हैं, तो आप केवल 'मेक' चला सकते हैं (यह पहला लक्ष्य चलाएगा)। यदि आप बस 'प्रोग्राम 2' चाहते हैं, तो 'प्रोग्राम 2 बनाएं' चलाएं। आपके पास अधिक नियंत्रण है। और निश्चित रूप से, एक लक्ष्य 'सभी: प्रोग्राम 1 प्रोग्राम 2' केवल यही करेगा (यह पहला है, आपके 2 अन्य लक्ष्य चला रहा है)। किया हुआ। –

उत्तर

51

यह इतना

all: program1 program2 

program1: program1.c 
    gcc -o program1 program1.c 

program2: program2.c 
    gcc -o program2 program2.c 

आपने कहा कि आप उन्नत सामान नहीं करना चाहती पसंद है, लेकिन आप भी कुछ डिफ़ॉल्ट नियमों के आधार पर इस तरह इसे छोटा कर सकते हैं।

all: program1 program2 

program1: program1.c 
program2: program2.c 
+3

ध्यान दें कि यदि आप दोनों प्रोग्राम स्वचालित रूप से बनाए रखना चाहते हैं, तो 'सभी' लक्ष्य मेकफ़ाइल में अलग-अलग कार्यक्रमों के सामने उपस्थित होना चाहिए, और मेकफ़ाइल में पहला लक्ष्य होना चाहिए। –

+2

आप जहां भी चाहें 'all' या कोई अन्य लक्ष्य डाल सकते हैं और' .DEFAULT_GOAL: = all' का उपयोग करके 'मेक' के लक्ष्य को लक्षित-कम (जिसे आपने "स्वचालित" कहा जाता है) के लिए डिफ़ॉल्ट बना दिया है। –

9
all: program1 program2 

program1: 
    gcc -Wall -o prog1 program1.c 

program2: 
    gcc -Wall -o prog2 program2.c 
0
all: program1 program2 

program1: 
    gcc -Wall -ansi -pedantic -o prog1 program1.c 

program2: 
    gcc -Wall -ansi -pedantic -o prog2 program2.c 

मैं नहीं बल्कि एएनएसआई और पंडिताऊ, अपने कार्यक्रम के लिए एक बेहतर नियंत्रण। जब भी आपको चेतावनियां होंगी तो यह आपको संकलित नहीं करेगा !!

+2

यह नहीं है कि '-pedantic' क्या है। '-pedantic' किसी भी गैर-ansi सुविधाओं को हटा देगा जो '-ansi' परमिट भी देता है। – cnicutar

+2

cnicutar की टिप्पणी में जोड़ने के लिए, '-Werror' चेतावनियों को त्रुटियों में बदल देगा। – jtniehof

1

एक साधारण प्रोग्राम का संकलन वर्कफ़्लो सरल है, मैं इसे एक छोटे ग्राफ के रूप में आकर्षित कर सकता हूं: स्रोत -> [संकलन] -> ऑब्जेक्ट [लिंकिंग] -> निष्पादन योग्य। इस ग्राफ में फ़ाइलें (स्रोत, वस्तु, निष्पादन योग्य) हैं, और नियम ( की शब्दावली बनाते हैं)। यह ग्राफ मेकफ़ाइल में निश्चित है।

जब आप लांच बनाने के लिए, यह Makefile, और बदल फ़ाइलों के लिए चेक पढ़ता है। यदि कोई है, तो यह नियम को ट्रिगर करता है, जो इस पर निर्भर करता है। नियमफ़ाइलें का उत्पादन/अद्यतन कर सकता है, जो अन्य नियम नियमों को ट्रिगर कर सकता है और इसी तरह। यदि आप एक अच्छा मेकफ़ाइल बनाते हैं, तो केवल नियम (कंपाइलर/लिंक कमांड) चलाए जाएंगे, जो निर्भरता पथ में संशोधित फ़ाइल से "अगली" है।

एक उदाहरण उठाओ Makefile, वाक्य रचना के लिए मैनुअल पढ़ने (वैसे भी, यह पहली नजर के लिए स्पष्ट है, w/ओ मैनुअल), और ग्राफ आकर्षित। परिणाम फ़ाइलों के नाम जानने के लिए आपको कंपाइलर विकल्पों को समझना होगा।

मेक ग्राफ उतना ही जटिल होना चाहिए जितना आप चाहते हैं। आप अनंत लूप भी कर सकते हैं (मत करो)! आप बना सकते हैं, जो नियम आपके लक्ष्य है, इसलिए केवल बाएं-खड़े फ़ाइलें ट्रिगर्स के रूप में उपयोग की जाएंगी।

फिर से: ग्राफ ड्रा!

19
############################################################################ 
# 'A Generic Makefile for Building Multiple main() Targets in $PWD' 
# Author: Robert A. Nader (2012) 
# Email: naderra at some g 
# Web: xiberix 
############################################################################ 
# The purpose of this makefile is to compile to executable all C source 
# files in CWD, where each .c file has a main() function, and each object 
# links with a common LDFLAG. 
# 
# This makefile should suffice for simple projects that require building 
# similar executable targets. For example, if your CWD build requires 
# exclusively this pattern: 
# 
# cc -c $(CFLAGS) main_01.c 
# cc main_01.o $(LDFLAGS) -o main_01 
# 
# cc -c $(CFLAGS) main_2..c 
# cc main_02.o $(LDFLAGS) -o main_02 
# 
# etc, ... a common case when compiling the programs of some chapter, 
# then you may be interested in using this makefile. 
# 
# What YOU do: 
# 
# Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable 
# the generation of a .exe suffix on executables 
# 
# Set CFLAGS and LDFLAGS according to your needs. 
# 
# What this makefile does automagically: 
# 
# Sets SRC to a list of *.c files in PWD using wildcard. 
# Sets PRGS BINS and OBJS using pattern substitution. 
# Compiles each individual .c to .o object file. 
# Links each individual .o to its corresponding executable. 
# 
########################################################################### 
# 
PRG_SUFFIX_FLAG := 0 
# 
LDFLAGS := 
CFLAGS_INC := 
CFLAGS := -g -Wall $(CFLAGS_INC) 
# 
## ==================- NOTHING TO CHANGE BELOW THIS LINE =================== 
## 
SRCS := $(wildcard *.c) 
PRGS := $(patsubst %.c,%,$(SRCS)) 
PRG_SUFFIX=.exe 
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS)) 
## OBJS are automagically compiled by make. 
OBJS := $(patsubst %,%.o,$(PRGS)) 
## 
all : $(BINS) 
## 
## For clarity sake we make use of: 
.SECONDEXPANSION: 
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,[email protected]) 
ifeq ($(PRG_SUFFIX_FLAG),0) 
     BIN = $(patsubst %$(PRG_SUFFIX),%,[email protected]) 
else 
     BIN = [email protected] 
endif 
## Compile the executables 
%$(PRG_SUFFIX) : $(OBJS) 
    $(CC) $(OBJ) $(LDFLAGS) -o $(BIN) 
## 
## $(OBJS) should be automagically removed right after linking. 
## 
veryclean: 
ifeq ($(PRG_SUFFIX_FLAG),0) 
    $(RM) $(PRGS) 
else 
    $(RM) $(BINS) 
endif 
## 
rebuild: veryclean all 
## 
## eof Generic_Multi_Main_PWD.makefile 
+1

उपरोक्त कोड के लिए धन्यवाद। मैं अपनी .c फाइलों को संकलित करने के लिए इसका उपयोग करता हूं। लेकिन अगर मैं अपनी myHeader.h फ़ाइलों में से किसी एक को बदलता हूं, तो मुझे 'मेक' का उपयोग करने से पहले .c फ़ाइल को दोबारा सहेजने की ज़रूरत है या नहीं, यह दिखाता है "बनाना: 'सभी' के लिए कुछ भी नहीं किया जाना चाहिए।" जबकि वास्तव में .h फ़ाइल में परिवर्तन किए गए हैं। क्या हम .c फाइल को फिर से सहेजने के बिना .h फ़ाइलों में किसी भी बदलाव के बाद संकलित करने के लिए मेक फ़ाइल को संशोधित कर सकते हैं? और उपरोक्त कोड के लिए धन्यवाद !!! – jatin3893

+0

धन्यवाद आवंटित। यह मेरे लिए बहुत उपयोगी था :) – SHRI

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था! – elbaulp

0
SRC = a.cpp b.cpp 
BIN = $(patsubst %.cpp,%,$(SRC)) 

all: $(BIN) 

clean: 
    rm -f $(BIN) 

.PHONY: all clean 

make all करना होगा:

c++  a.cpp -o a 
c++  b.cpp -o b 

आप CXX और CXXFLAGS चर सेट करते हैं make उनका उपयोग करेगा।

+1

क्या आपका मतलब 'a.cpp -o a' था? –

+0

हां, धन्यवाद। फिक्स्ड। –

7

Pattern rules इस प्रकार आप एक से अधिक ग फ़ाइलें जो make का उपयोग कर एक ही संकलन आदेशों की आवश्यकता संकलन करते हैं:

objects = program1 program2 
all: $(objects) 

$(objects): %: %.c 
     $(CC) $(CFLAGS) -o [email protected] $< 
संबंधित मुद्दे