来自.c .cpp和.S源的Makefile对象

时间:2017-05-05 08:12:00

标签: makefile gnu-make

我的makefile遇到问题。我正在尝试编译.c;来自./src/的.cpp和.S文件。对象应该进入./obj/,二进制文件应该进入./bin/。使用我当前的文件,它尝试搜索./src/中的文件,但尝试为每个扩展编译对象文件。所以例如,如果它找到kernel.cpp,它将尝试编译kernel.S和kernel.c,但它们不存在,所以我得到一个错误。

这是我的代码:

TARGET = kernel

CC = gcc
LD = ld

SRCDIR = src
OBJDIR = obj
BINDIR = bin

SRCS = $(wildcard $(SRCDIR)/*.c) $(wildcard $(SRCDIR)/*.cpp) $(wildcard $(SRCDIR)/*.S)
HDR = $(wildcard $(SRCDIR)/*.h)
OBJS = $(SRCS:$(SRCDIR)/%.c=$(OBJDIR)/%.o) $(SRCS:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o) $(SRCS:$(SRCDIR)/%.S=$(OBJDIR)/%.o)
rm = rm -f

ASFLAGS = -m64
CFLAGS = -m64 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -m elf_x86_64 -Ttext=0x100000

$(BINDIR)/$(TARGET): $(OBJS)
    $(LD) $(OBJS) $(LDFLAGS) -o $@

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -c $< -o $@

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.S
    $(CC) $(ASFLAGS) -c $< -o $@

.PHONY: clean
clean:
    $(rm) $(OBJS)

.PHONY: remove
remove:
    $(rm) $(BINDIR)/$(TARGET)

我可能会尝试将SRCS分成SRCS_Cpp等等......但我不知道这是否是最佳解决方案。我是makefiles的新手^^

我想我找到了解决方案^^

TARGET = kernel

CC = gcc
LD = ld

SRCDIR = src
OBJDIR = obj
BINDIR = bin

SRCS_c = $(wildcard $(SRCDIR)/*.c)
SRCS_cpp = $(wildcard $(SRCDIR)/*.cpp)
SRCS_S = $(wildcard $(SRCDIR)/*.S)
HDR = $(wildcard $(SRCDIR)/*.h)
OBJS = $(SRCS_c:$(SRCDIR)/%.c=$(OBJDIR)/%_c.o) $(SRCS_cpp:$(SRCDIR)/%.cpp=$(OBJDIR)/%_cpp.o) $(SRCS_S:$(SRCDIR)/%.S=$(OBJDIR)/%_S.o)
rm = rm -f

ASFLAGS = -m64
CFLAGS = -m64 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -m elf_x86_64 -Ttext=0x100000

$(BINDIR)/$(TARGET): $(OBJS)
    $(LD) $(OBJS) $(LDFLAGS) -o $@

$(OBJDIR)/%_c.o : $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR)/%_cpp.o : $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR)/%_S.o : $(SRCDIR)/%.S
    $(CC) $(ASFLAGS) -c $< -o $@

.PHONY: clean
clean:
    $(rm) $(OBJS)

.PHONY: remove
remove:
    $(rm) $(BINDIR)/$(TARGET)

我做错了吗?我试图编译内核而不使用交叉编译器^^

0 个答案:

没有答案