Một vài tháng trước, tôi đã nghĩ ra những Makefile
bài tập chung sau đây cho các bài tập ở trường:
# ------------------------------------------------
# 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!"
Điều này về cơ bản sẽ biên dịch mọi tệp .c
và .h
tệp để tạo .o
tệp và tệp thực thi projectname
tất cả trong cùng một thư mục.
Bây giờ, tôi muốn nhấn mạnh điều này một chút. Làm cách nào để viết một Makefile để biên dịch một dự án C với cấu trúc thư mục sau?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
Nói cách khác, tôi muốn có một Makefile biên dịch các nguồn C từ ./src/
thành ./obj/
và sau đó liên kết mọi thứ để tạo tệp thực thi trong ./bin/
.
Tôi đã cố gắng đọc các Makefiles khác nhau, nhưng tôi chỉ đơn giản là không thể làm cho chúng hoạt động cho cấu trúc dự án ở trên; thay vào đó, dự án không thể biên dịch với tất cả các loại lỗi. Chắc chắn, tôi có thể sử dụng IDE hoàn chỉnh (Monodevelop, Anjuta, v.v.), nhưng thực sự tôi thích gắn bó với gEdit và thiết bị đầu cuối tốt hơn.
Có chuyên gia nào có thể cho tôi một giải pháp làm việc hoặc thông tin rõ ràng về cách có thể thực hiện điều này không? Cảm ơn bạn!
** CẬP NHẬT (v4) **
Giải pháp cuối cùng :
# ------------------------------------------------
# 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!"