दिलचस्प है, मुझे नहीं पता था कि स्रोत फ़ाइलों के संबंध में सी संकलक के नियमों का उपयोग करने के लिए डिफ़ॉल्ट होगा।
वैसे भी, एक सरल समाधान जो सरल मेकफाइल अवधारणाओं को प्रदर्शित करता है:
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 को अपडेट नहीं करना पड़ेगा। हालाँकि, यदि आप उत्पन्न निष्पादन योग्य, पुस्तकालयों या संकलक झंडे का नाम बदलना चाहते हैं, तो आप केवल चर को संशोधित कर सकते हैं।
किसी भी मामले में, कृपया ऑटोकॉन्फ़ का उपयोग न करें। मैं तुमसे भीक मांगता हूँ! :)