Birkaç ay önce, Makefile
okul ödevleri için aşağıdaki jeneriği buldum :
# ------------------------------------------------
# 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!"
Bu, temelde dosyaları ve yürütülebilir dosyaları aynı klasörde oluşturmak için her .c
ve .h
dosyayı derler ..o
projectname
Şimdi, bunu biraz zorlamak istiyorum. Aşağıdaki dizin yapısıyla bir C projesini derlemek için nasıl Makefile yazabilirim?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
Diğer bir deyişle, ben den derler C kaynakları bir Makefile olmasını isterdim ./src/
içine ./obj/
bağlantı herşeyden daha ve de yürütülebilir oluşturmak ./bin/
.
Farklı Makefile'ları okumaya çalıştım, ancak bunları yukarıdaki proje yapısı için çalıştıramıyorum; bunun yerine proje her türlü hatayı derleyemez. Elbette, tam gelişmiş IDE (Monodevelop, Anjuta, vb.) Kullanabilirim, ancak dürüst olmak gerekirse gEdit ve iyi ol 'terminaline bağlı kalmayı tercih ederim.
Bana çalışan bir çözüm verebilecek veya bunun nasıl yapılabileceğine dair net bilgi verebilecek bir guru var mı? Teşekkür ederim!
** GÜNCELLEME (v4) **
Son çözüm :
# ------------------------------------------------
# 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!"