C++ 我的编译行和生成文件之间有什么不同可能导致错误?

C++ 我的编译行和生成文件之间有什么不同可能导致错误?,c++,gcc,makefile,C++,Gcc,Makefile,我以前写过一个编译行,它正在工作。 然而,我的Makefile生成了或多或少相同的东西,但没有成功编译 命令行(工作): 生成文件: CC = sh3eb-elf-gcc SRCDIR = src INCLDIR = include LIBDIR = libs EXTENSIONS = c cpp s LIBS = -lgcc -lmonochrome -lfx WFLAGS = -Wall CFLAGS = -I $(INCLDIR) $(WFLAGS) LFLAGS = -m3 -mb -f

我以前写过一个编译行,它正在工作。 然而,我的Makefile生成了或多或少相同的东西,但没有成功编译

命令行(工作):

生成文件:

CC = sh3eb-elf-gcc
SRCDIR = src
INCLDIR = include
LIBDIR = libs
EXTENSIONS = c cpp s
LIBS = -lgcc -lmonochrome -lfx
WFLAGS = -Wall
CFLAGS = -I $(INCLDIR) $(WFLAGS)
LFLAGS = -m3 -mb -ffreestanding -nostdlib -T addin.ld -L $(LIBDIR) $(LIBS) -O2 -fno-exceptions
SRCS := $(SRCS) $(foreach EXT,$(EXTENSIONS),$(wildcard $(SRCDIR)/*.$(EXT)))
OBJS := $(OBJS) $(foreach EXT,$(EXTENSIONS),$(patsubst $(SRCDIR)/%.$(EXT),%.o,$(wildcard $(SRCDIR)/*.$(EXT))))
OUT = addin

all : $(OUT).elf

$(OUT).elf : $(OBJS)
    $(CC) $(LFLAGS) -o $@ $^

$(OBJS) : $(SRCDIR)/$(SRCS)
    $(CC) $(CFLAGS) -c $(SRCS)

clean:
    rm -f *.o

cleaner:
    rm -f *.o $(OUT).elf $(OUT).g1a $(OUT).bin
从makefile生成的行:

sh3eb-elf-gcc -I include -Wall -c  src/MonochromeLib.c src/BTKOM.cpp src/bluetooth.cpp src/syscall.s src/crt0.s
sh3eb-elf-gcc -m3 -mb -ffreestanding -nostdlib -T addin.ld -L libs -lgcc -lmonochrome -lfx -O2 -fno-exceptions -o addin.elf MonochromeLib.o BTKOM.o bluetooth.o syscall.o crt0.o
输出:

BTKOM.o: In function `_main':
BTKOM.cpp:(.text+0xc4): undefined reference to `_memset'
BTKOM.cpp:(.text+0xec): undefined reference to `_GetKey'
bluetooth.o: In function `Bluetooth::Bluetooth()':
bluetooth.cpp:(.text+0xa0): undefined reference to `_srand'
bluetooth.cpp:(.text+0xa4): undefined reference to `_rand'
bluetooth.cpp:(.text+0xac): undefined reference to `_memcpy'
...
内置链接规则定义为

$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
LINK.o

$(CC) $(LDFLAGS) $(TARGET_ARCH)
您应该发现,将makefile重写为

LDLIBS  := -lgcc -lmonochrome -lfx
LDFLAGS := -nostdlib -T addin.ld -L libs

$(OUT).elf: $(OBJS)
    $(LINK.o) $^ $(LDLIBS) -o $@

请注意,
-O2
f重建
-fno异常
是编译选项,而不是链接选项(我认为
-m3
-mb
也是如此)。

@user4581301我知道
-nostlib
,并且我是故意使用它的。它正在使用我的编译行。这些指令是在libgcc(
-lgcc
)中定义的,明白了,它只是
$(CC)-o$@$^$(LFLAGS)
而不是
$(CC)$(LFLAGS)-o$@$^
…好的。我看起来像个傻瓜。可能是点菜。o列在库之后,因此链接器不知道它必须在库中查找BTKOM.oHa所需的内容!时间安排如何?
LDLIBS  := -lgcc -lmonochrome -lfx
LDFLAGS := -nostdlib -T addin.ld -L libs

$(OUT).elf: $(OBJS)
    $(LINK.o) $^ $(LDLIBS) -o $@