Beberapa bulan yang lalu, saya datang dengan generik berikut Makefile
untuk tugas sekolah:
# ------------------------------------------------
# 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!"
Ini pada dasarnya akan mengkompilasi setiap .c
dan .h
file untuk menghasilkan .o
file dan projectname
semua yang dapat dieksekusi dalam folder yang sama.
Sekarang, saya ingin mendorongnya sedikit. Bagaimana cara menulis Makefile untuk mengkompilasi proyek C dengan struktur direktori berikut?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
Dengan kata lain, saya ingin memiliki Makefile yang mengkompilasi sumber C dari ./src/
ke ./obj/
dan kemudian menautkan semuanya untuk membuat file yang dapat dieksekusi ./bin/
.
Saya telah mencoba membaca Makefile yang berbeda, tetapi saya tidak dapat membuatnya berfungsi untuk struktur proyek di atas; sebaliknya, proyek gagal untuk dikompilasi dengan segala macam kesalahan. Tentu, saya bisa menggunakan IDE yang lengkap (Monodevelop, Anjuta, dll.), Tetapi sejujurnya saya lebih suka menggunakan gEdit dan terminal lama yang bagus.
Apakah ada guru yang bisa memberi saya solusi yang berfungsi, atau informasi yang jelas tentang bagaimana ini bisa dilakukan? Terima kasih!
** PERBARUI (v4) **
Solusi terakhir:
# ------------------------------------------------
# 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!"