gpt4 book ai didi

c++ - 无法弄清楚我的 Makefile 有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 23:01:01 25 4
gpt4 key购买 nike

所以,首先,我想明确表示我几乎没有使用 Make 的经验,它是 Makefile。话虽这么说,我已经尝试在整个互联网上寻找有关通配符和递归技术的信息来编译和链接我的项目。直到我在这个站点上找到一个使用 make 的模块化类型系统的线程。

我想先向大家展示一下我的项目是如何构建的:

.
|---- Makefile
|
|---- build/
| |---- bin/
| |
| |____ obj/
|
|---- includes/
| |
| |____ graphics/
| |____ vga.h
|
|---- libs/
| |____ linker.ld
|
|____ src/
|---- module.mk
|
|---- asm/
| |---- asm_module.mk
| |____ boot.s
|
|____ cpp/
|---- cpp_module.mk
|---- main/
| |---- main_module.mk
| |____ main.cpp
|
|____ graphics/
|---- graphics_module.mk
|____ vga.cpp

所以现在你知道了。我制作了以下 Makefile 和 module.mk 来尝试制作项目:

生成文件:

PROJECT := GOODY

CXX := i686-elf-g++
LD := i686-elf-ld
AS := nasm

SRC_DIR := src
BUILD_DIR := build
OBJ_DIR := $(BUILD_DIR)/obj
BIN_DIR := $(BUILD_DIR)/bin

CXX_SRCS :=
ASM_SRCS :=
SUBDIRS :=
CXXFLAGS :=
LDFLAGS :=

include $(SRC_DIR)/module.mk

CXX_OBJS := $(addprefix $(OBJ_DIR)/, $(CXX_SRCS:.cpp=.o))
ASM_OBJS := $(addprefix $(OBJ_DIR)/, $(ASM_SRCS:.s=.o))

OBJS := $(CXX_OBJS) $(ASM_OBJS)

DEPS := $(OBJS:.o=.d)

TMPS := $(OBJS) $(OBJS:.o=.d)

CXXFLAGS := -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector \
-fno-rtti -O2 -Wall -Werror -fno-exceptions -ffreestanding \
-m32 -Iincludes
LDFLAGS := -Tlibs/linker.ld -melf_i386 --oformat=elf32-i386
ASFLAGS := -felf

all: $(BIN_DIR)/$(PROJECT)

$(OBJ_DIR)/%.o, $(SRC_DIR)/%.cpp
@echo "\tCompiling [$@]"
$(CXX) $(CXXFLAGS) $< -o $@

$(OBJ_DIR)/%.o, $(SRC_DIR)/%.s
@echo "\tCompiling [$@]"
$(AS) $(ASFLAGS) $< -o $@

$(BIN_DIR)/$(PROJECT): $(OBJS)
@echo "\tLinking Kernel..."
@$(LD) $(OBJS) -o $(PROJECT) $(LDFLAGS)

$(OBJS): | $(OBJ_DIR)

$(OBJ_DIR):
@mkdir -p $(OBJ_DIR)
@for dir in $(SUBDIRS); \
do \
mkdir -p $(OBJ_DIR)/$$dir; \
done

clean:
rm -rf $(TMPS)
rm -rf $(BIN_DIR)/$(PROJECT)
rm -rf $(OBJ_DIR)

.PHONY: clean

模块.mk:

SUBDIRS += asm cpp

include $(SRC_DIR)/asm/asm_module.mk
include $(SRC_DIR)/cpp/cpp_module.mk

asm_module.mk:

UP_DIR := asm

MOD_SRCS := boot.s

ASM_SRCS := $(addprefix $(UP_DIR)/, $(MOD_SRCS))

cpp_module.mk:

SUBDIRS := main graphics

include $(SRC_DIR)/cpp/main/main_module.mk
include $(SRC_DIR)/cpp/graphics/graphics_module.mk

主模块.mk:

UP_DIR := main

MOD_SRCS := main.cpp

CXX_SRCS := $(addprefix $(UP_DIR)/, $(MOD_SRCS))

图形模块.mk:

UP_DIR := graphics

MOD_SRCS := vga.cpp

CXX_SRCS := $(addprefix $(UP_DIR)/, $(MOD_SRCS))

现在来看我从 make 中得到的错误。如下:

$ make
Linking Kernel...
i686-elf-ld: cannot find build/obj/graphics/vga.o: No such file or directory
i686-elf-ld: cannot find build/obj/asm/boot.o: No such file or directory
Makefile:49: recipe for target 'build/bin/GOODY' failed
make: *** [build/bin/GOODY] Error 1

现在我可以从中看到,ld 找不到 .o 文件...在查看 build/obj 目录后,里面什么也没有。

我的问题是,我做错了什么?

编辑:=所以看起来它实际上根本没有编译 *.cpp 或 *.s 文件,它只是直接跳到链接阶段,显然没有找到任何链接。

所以猜测它也可能与以下内容有关:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CXX) $(CXXFLAGS) $< -o $@

我也尝试了原始线程建议的内容:

$(COMPILE.cpp) $(OUTPUT_OPTION) $< # Also $(COMPILE.c) too.

最佳答案

因此,在将我的笔​​记本电脑放在它自己的设备上一段时间后,我重新开始使用它,并意识到我后来做错了一些事情。

我需要让 *.mk 文件有这个:

模块.mk:

DIR_SRC := src

SUBDIRS := cpp asm

include $(DIR_SRC)/cpp/cpp_module.mk
include $(DIR_SRC)/asm/asm_module.mk

cpp_module.mk:

DIR_CPP := cpp

SUBDIRS := main graphics

include $(SRC_DIR)/$(DIR_CPP)/main/main_module.mk
include $(SRC_DIR)/$(DIR_CPP)/graphics/graphics_module.mk

main.module.mk:(注意:这与 graphics_module.mk 几乎相同)

DIR_MAIN := main

MOD_SRCS := main.cpp

CXX_SRCS := $(addprefix $(DIR_CPP)/$(DIR_MAIN)/, $(MOD_SRCS))

这解决了我的问题。

关于c++ - 无法弄清楚我的 Makefile 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31969149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com