कुछ महीने पहले, मैं Makefile
स्कूल के कामों के लिए निम्नलिखित जेनेरिक के साथ आया :
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2010-11-05
#
# Changelog :
# 0.01 - first version
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc -std=c99 -c
# compiling flags here
CFLAGS = -Wall -I.
LINKER = gcc -o
# linking flags here
LFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): obj
@$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
obj: $(SOURCES) $(INCLUDES)
@$(CC) $(CFLAGS) $(SOURCES)
@echo "Compilation complete!"
clean:
@$(rm) $(TARGET) $(OBJECTS)
@echo "Cleanup complete!"
यह मूल रूप से हर संकलित कर देगा .c
और .h
फ़ाइल उत्पन्न करने के लिए .o
फ़ाइलों और निष्पादन योग्य projectname
एक ही फ़ोल्डर में सभी।
अब, मैं इसे थोड़ा आगे बढ़ाना चाहूंगा। निम्नलिखित निर्देशिका संरचना के साथ एक सी परियोजना को संकलित करने के लिए मैं एक मेकफिल कैसे लिख सकता हूं?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
दूसरे शब्दों में, मैं एक ऐसा मेकफाइल रखना चाहूंगा जिसमें C स्रोतों को संकलित ./src/
किया जाए ./obj/
और फिर निष्पादन योग्य बनाने के लिए सब कुछ लिंक किया जाए ./bin/
।
मैंने अलग-अलग मेकफाइल्स को पढ़ने की कोशिश की है, लेकिन मैं केवल उन्हें प्रोजेक्ट संरचना के लिए काम नहीं कर सकता; इसके बजाय, परियोजना सभी प्रकार की त्रुटियों के साथ संकलन करने में विफल रहती है। निश्चित रूप से, मैं पूर्ण विकसित आईडीई (मोनोडेवलप, अंजुता, आदि) का उपयोग कर सकता था, लेकिन मैं ईमानदारी से जीडिट और अच्छे ओल 'टर्मिनल के साथ रहना पसंद करता हूं।
क्या कोई गुरु है जो मुझे एक काम करने वाला समाधान दे सकता है, या इस बारे में स्पष्ट जानकारी दे सकता है कि यह कैसे किया जा सकता है? धन्यवाद!
** अद्यतन (v4) **
अंतिम समाधान :
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2011-08-10
#
# Changelog :
# 2010-11-05 - first version
# 2011-08-10 - added structure : sources, objects, binaries
# thanks to http://stackoverflow.com/users/128940/beta
# 2017-04-24 - changed order of linker params
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc
# compiling flags here
CFLAGS = -std=c99 -Wall -I.
LINKER = gcc
# linking flags here
LFLAGS = -Wall -I. -lm
# change these to proper directories where each file should be
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $(OBJECTS) $(LFLAGS) -o $@
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Executable removed!"
Makefile
। मैं पास हो रहा हूं, लेकिन मुझे स्वचालित चर के साथ परेशानी है, इसलिए यह वैसे भी लगता है