मैं लिनक्स पर gcc के लिए एक सरल मेकफिल कैसे बनाऊं?


130

मैं तीन फ़ाइलें: program.c, program.hऔर headers.h

program.cशामिल program.hऔर headers.h

मुझे gcc संकलक का उपयोग करके लिनक्स पर इसे संकलित करने की आवश्यकता है । मुझे यकीन नहीं है कि यह कैसे करना है। Netbeans ने मेरे लिए एक बनाया, लेकिन यह खाली है।


1
Spin.atomicobject.com/2016/08/26/makefile-c-projects पर एक बहुत ही सुंदर (और अच्छी तरह से प्रलेखित) समाधान है ।
केसी

जवाबों:


193

दिलचस्प है, मुझे नहीं पता था कि स्रोत फ़ाइलों के संबंध में सी संकलक के नियमों का उपयोग करने के लिए डिफ़ॉल्ट होगा।

वैसे भी, एक सरल समाधान जो सरल मेकफाइल अवधारणाओं को प्रदर्शित करता है:

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

(ध्यान रखें कि स्पेस इंडेंटेशन के बजाय टैब की आवश्यकता होती है, इसलिए इसे कॉपी करते समय ठीक करना सुनिश्चित करें)

हालाँकि, अधिक C फ़ाइलों का समर्थन करने के लिए, आपको उनमें से प्रत्येक के लिए नए नियम बनाने होंगे। इस प्रकार, सुधार करने के लिए:

HEADERS = program.h headers.h
OBJECTS = program.o

default: program

%.o: %.c $(HEADERS)
    gcc -c $< -o $@

program: $(OBJECTS)
    gcc $(OBJECTS) -o $@

clean:
    -rm -f $(OBJECTS)
    -rm -f program

मैंने इसे $ (CC) और $ (CFLAGS) जैसे वेरिएबल को छोड़ कर इसे सरल बनाने की कोशिश की, जो आमतौर पर मेकफाइल्स में देखा जाता है। यदि आप उस का पता लगाने में रुचि रखते हैं, तो मुझे आशा है कि मैंने आपको उस पर एक अच्छी शुरुआत दी है।

यहाँ मैं सी स्रोत के लिए उपयोग करना पसंद Makefile है। इसका इस्तेमाल करने के लिए स्वतंत्र महसूस करें:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

यह स्वचालित रूप से .c और .h फ़ाइलों को वर्तमान निर्देशिका में शामिल करने के लिए वाइल्डकार्ड और patsubst सुविधाओं का उपयोग करता है, जिसका अर्थ है कि जब आप अपनी निर्देशिका में नई कोड फ़ाइलें जोड़ते हैं, तो आपको Makefile को अपडेट नहीं करना पड़ेगा। हालाँकि, यदि आप उत्पन्न निष्पादन योग्य, पुस्तकालयों या संकलक झंडे का नाम बदलना चाहते हैं, तो आप केवल चर को संशोधित कर सकते हैं।

किसी भी मामले में, कृपया ऑटोकॉन्फ़ का उपयोग न करें। मैं तुमसे भीक मांगता हूँ! :)


7
तकनीकी रूप से सही होने के लिए, मेरा मानना ​​है कि आपको .PHONY: clean all defaultउन लक्ष्यों के लिए उपयोग करना चाहिए जो कमांड लाइन से उपयोग किए जाने के लिए हैं। इसके अलावा, Autoconf / Automake वो ख़राब नहीं हैं। निश्चित रूप से, वे भयानक महसूस करते हैं, और उनका उपयोग करने के बारे में एक ईंट की दीवार के माध्यम से अपने सिर को मजबूर करने के रूप में मज़ेदार है, लेकिन वे काम करते हैं, और वे अच्छी तरह से विकसित हैं, और वे आपके अधिकांश ठिकानों को पोर्टेबिलिटी के रूप में कवर करेंगे, और एक बार आप अपने भयानक डिजाइन के लिए इस्तेमाल होने के बाद अपने जीवन को बहुत आसान बना देंगे।
क्रिस लुत्ज

मुझे लगता है कि यह काम करता है, लेकिन मुझे लगा कि अगर मैंने टर्मिनल पर "मेक" टाइप किया तो प्रोग्राम चलना चाहिए। यह वही है जो मुझे मिलता है: gccystsh.o -Wall -lm -o prog क्या केवल प्रोग्राम बनाना और निष्पादित करना संभव है?
user69514

आप कहां ओपन-फ्लैग फ्लैग जोड़ेंगे -fopenmp
MySchizoBuddy

1
ऑटोकॉन्फ़ जॉय-एडम्स का उपयोग क्यों नहीं करते?
मिशाल गोंडा

7
अगर किसी को आश्चर्य हो कि सामने क्यों डैश हैं rm: stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Tor Klingberg

25

उदाहरण के लिए यह सरल मेकफाइल पर्याप्त होना चाहिए:

सीसी = जीसीसी 
CFLAGS = -Wall

सभी: कार्यक्रम
कार्यक्रम: कार्यक्रम
program.o: program.c program.h हेडर्स.एच

स्वच्छ:
    rm -f प्रोग्राम program.o
प्रोग्राम चलाओ
    ./program

नोट <tab>स्वच्छ और चलाने के बाद अगली पंक्ति में होना चाहिए , रिक्त स्थान नहीं।

अद्यतन लागू नीचे टिप्पणियाँ


@ user69514: makeबिना किसी तर्क के आमतौर पर केवल आपके सॉफ्टवेयर का निर्माण होता है। इसे चलाने के लिए, या तो उपयोग करें make run(इस उत्तर में उपलब्ध, लेकिन जरूरी नहीं कि सभी में Makefile), या इसे सीधे चलाएं:./program
MestreLion

14
all: program
program.o: program.h headers.h

पर्याप्त है। शेष निहित है


1
और यदि आपका पूरा कार्यक्रम एक ही .cफाइल है, तो केवल program:आवश्यक है। स्वीट :)
मेस्टेरलियन

10

सरलतम फ़ाइल हो सकती है

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o

आप यह समझाने के लिए और अधिक विवरण जोड़ सकते हैं कि आपका Makefile क्या करता है
Federico

2
आप वास्तव में बहुत सरल जा सकते हैं। देखें @ अनाम 1 लाइनर
मार्क लाकटा

0

हेडर की संख्या और आपके विकास की आदतों के आधार पर, आप gccmakedep की जांच करना चाहते हैं। यह प्रोग्राम आपकी वर्तमान निर्देशिका की जांच करता है और प्रत्येक .c / cpp फ़ाइल के लिए हेडर निर्भरता को मेकफाइल के अंत में जोड़ता है। यह ओवरकिल है जब आपके पास 2 हेडर और एक प्रोग्राम फ़ाइल है। हालांकि, यदि आपके पास 5+ छोटे परीक्षण कार्यक्रम हैं और आप 10 हेडर में से एक का संपादन कर रहे हैं, तो आप वास्तव में उन कार्यक्रमों को फिर से बनाने के लिए विश्वास कर सकते हैं जो आपके संशोधनों द्वारा बदल दिए गए थे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.