2009-09-27 6 views
94

मेरे पास तीन फाइलें हैं: program.c, program.h और headers.hमैं लिनक्स पर जीसीसी के लिए एक सरल मेकफ़ाइल कैसे बना सकता हूं?

program.cprogram.h और headers.h शामिल है।

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

उत्तर

145

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

वैसे भी, एक सरल उपाय है कि यह दर्शाता है सरल Makefile अवधारणाओं होगा:

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 

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

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

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

default: program 

%.o: %.c $(HEADERS) 
    gcc -c $< -o [email protected] 

program: $(OBJECTS) 
    gcc $(OBJECTS) -o [email protected] 

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

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

यहाँ 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 [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

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

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

या तो मामले में, autoconf का उपयोग नहीं करते, कृपया। मैं तुमसे भीक मांगता हूँ! :)

+6

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

+0

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

+0

आप ओपनएमएम फ्लैग -फॉपेंम्प – MySchizoBuddy

22

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

 
CC=gcc 
CFLAGS=-Wall 

all: program 
program: program.o 
program.o: program.c program.h headers.h 

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

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

अद्यतन टिप्पणियाँ

+0

@ user69514 हो सकता है: 'कोई तर्क के साथ make' आमतौर पर केवल * निर्माण * अपने सॉफ्टवेयर। इसे चलाने के लिए, या तो 'रन रन' का उपयोग करें (इस उत्तर में उपलब्ध है, लेकिन सभी 'मेकफ़ाइल' में जरूरी नहीं है, या इसे सीधे चलाएं: '/ प्रोग्राम' – MestreLion

-9
gcc program.c -o program 

कोई makefile आवश्यक आवेदन किया।

+25

यदि आपका प्रोग्राम कोई बड़ा हो, तो अनजान है, नहीं आपको लगता है? –

10
all: program 
program.o: program.h headers.h 

पर्याप्त है। बाकी निहित

+0

और यदि आपका पूरा कार्यक्रम एक '.c' फ़ाइल है, तो केवल' प्रोग्राम: 'आवश्यक है। मीठे :) – MestreLion

0

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

7

सरल फ़ाइल

all : test 

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

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

clean : 
     rm test *.o 
+0

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

+1

क्या है, आप वास्तव में बहुत सरल हो सकते हैं। @ बेनामी 1 लाइनर देखें –

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