c++生成文件错误

C++ Makefile LD Error

本文关键字:错误 文件 c++      更新时间:2023-10-16

我正在用libopencm3在c++中编程ARM。但是我的Makefile包含错误。就像你现在看到的!

我有以下Makefile:

Q           = @
RM          = @rm -f
MAKE        = make
CC          = arm-none-eabi-gcc
CPP         = arm-none-eabi-g++
LD          = arm-none-eabi-gcc
OBC         = arm-none-eabi-objcopy
OBD         = arm-none-eabi-objdump
SIZ         = arm-none-eabi-size
STFLASH     = st-flash
FIRMWARE    = FIRMWARE
LIBNAME     = opencm3_stm32f1
SRCS        = main.cpp Robot.cpp
OBJS        = $(SRCS:%.cpp=$(OBJ_DIR)/%.o)
OPENCM3_DIR = $(realpath libopencm3)
INCLUDE_DIR = $(OPENCM3_DIR)/include
LIB_DIR     = $(OPENCM3_DIR)/lib
SCRIPT_DIR  = $(OPENCM3_DIR)/scripts
OBJ_DIR     = ./build
LDSCRIPT    = stm32f103c8t6.ld
CPPFLAGS    = -g -Os -Wall
CPPFLAGS    += -Wextra -Wshadow -Wredundant-decls -Weffc++
CPPFLAGS    += -fno-common -ffunction-sections -fdata-sections
CPPFLAGS    += -MD -Wall -Wundef
CPPFLAGS    += -I$(INCLUDE_DIR) -DSTM32F1
CPPFLAGS    += -msoft-float -mfix-cortex-m3-ldrd
CPPFLAGS    += -mthumb -mcpu=cortex-m3
LDFLAGS     = --static -nostartfiles
LDFLAGS     += -L$(LIB_DIR)
LDFLAGS     += -T$(LDSCRIPT)
LDFLAGS     += -Wl,-Map=$(OBJ_DIR)/$(FIRMWARE).MAP
LDFLAGS     += -Wl,--gc-sections
LDFLAGS      += -msoft-float -mfix-cortex-m3-ldrd
LDFLAGS      += -mthumb -mcpu=cortex-m3
LDLIBS      = -l$(LIBNAME)
LDLIBS      += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
all: bin elf hex
lib:
    $(Q)if [ ! "`ls -A libopencm3`" ] ; then 
        printf "######## ERROR ########n"; 
        printf "tPlease run:n"; 
        printf "tgit clone https://github.com/libopencm3/libopencm3.gitn"; 
        printf "######## ERROR ########n"; 
        exit 1; 
        fi
    $(Q)$(MAKE) -C libopencm3
elf: $(OBJ_DIR)/$(FIRMWARE).ELF
bin: $(OBJ_DIR)/$(FIRMWARE).BIN
hex: $(OBJ_DIR)/$(FIRMWARE).HEX
dox:
    $(Q)doxygen Doxyfile
$(OBJ_DIR)/$(FIRMWARE).BIN: $(OBJ_DIR)/$(FIRMWARE).ELF
    $(Q)printf "  OBJCOPY $(OBJ_DIR)/$(FIRMWARE).BINn"
    $(Q)$(OBC) -Obinary $(OBJ_DIR)/$(FIRMWARE).ELF $(OBJ_DIR)/$(FIRMWARE).BIN
$(OBJ_DIR)/$(FIRMWARE).HEX: $(OBJ_DIR)/$(FIRMWARE).ELF
    $(Q)printf "  OBJCOPY $(OBJ_DIR)/$(FIRMWARE).HEXn"
    $(Q)$(OBC) -Oihex $(OBJ_DIR)/$(FIRMWARE).ELF $(OBJ_DIR)/$(FIRMWARE).HEX
$(OBJ_DIR)/$(FIRMWARE).ELF $(OBJ_DIR)/$(FIRMWARE).MAP: $(OBJS) $(LDSCRIPT) $(LIB_DIR)/lib$(LIBNAME).a
    $(Q)printf "  LD      $(OBJ_DIR)/$(FIRMWARE).ELFn"
    $(Q)$(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(OBJ_DIR)/$(FIRMWARE).ELF
    $(Q)$(SIZ) $(OBJ_DIR)/$(FIRMWARE).ELF
$(OBJS): $(SRCS)
    $(Q)printf "  CPP     $(*).cppn"
    $(Q)$(CPP) $(CPPFLAGS) -o $@ -c $<
flash: $(OBJ_DIR)/$(FIRMWARE).BIN
    $(Q)printf "  FLASH   $(OBJ_DIR)/$(FIRMWARE).BINn"
    $(Q)$(STFLASH) write $(OBJ_DIR)/$(FIRMWARE).BIN 0x8000000
libclean:
    $(Q)$(MAKE) -C libopencm3 clean
clean:
    $(Q)printf "  CLEANn"
    $(Q)$(RM) $(OBJ_DIR)/*.o
    $(Q)$(RM) $(OBJ_DIR)/*.d
deepclean: clean
    $(Q)$(RM) $(OBJ_DIR)/$(FIRMWARE).*

但是链接(LD)不起作用。查看错误:

  CPP     build/main.cpp
main.cpp: In function 'int main()':
main.cpp:25:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i = 0; i < 36000000UL; i++)
                        ^
  CPP     build/Robot.cpp
main.cpp: In function 'int main()':
main.cpp:25:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i = 0; i < 36000000UL; i++)
                        ^
  LD      ./build/FIRMWARE.ELF
./build/Robot.o: In function `main':
/home/martin/Dropbox/workspace/electronics/arm/Procyon/main.cpp:15: multiple definition of `main'
./build/main.o:/home/martin/Dropbox/workspace/electronics/arm/Procyon/main.cpp:15: first defined here
collect2: error: ld returned 1 exit status
Makefile:73: recipe for target 'build/FIRMWARE.ELF' failed
make: *** [build/FIRMWARE.ELF] Error 1

错误在哪里?我不知道LD有什么问题,当我使用这个makefile for C(不是c++)它工作得很好!

也许是因为我使用gcc而不是g++来进行LD'ing?

谢谢,马丁

您已经使每个对象依赖于所有

$(OBJS): $(SRCS)

改成

$(OBJS): $(OBJ_DIR)/%.o: %.cpp

$(OBJ_DIR)/%.o: %.cpp