makefile的问题

makefile的问题,makefile,cross-compiling,Makefile,Cross Compiling,要使用库,我必须修改makefile,以使用交叉编译器arm-none-eabi-g++而不是arm-none-eabi-gcc;然而,由于一些奇怪的原因,我不断收到一个无规则来生成target错误。我删除了依赖项,只保留了启动代码和main,还尝试使用文件的绝对路径。但是,我继续收到错误消息。有人有什么建议吗 PROJECT_NAME=test-liv BUILDDIR = build LIBDIR = ../common DEVICE = $(LIBDIR)/STM32F4xx CORE

要使用库,我必须修改makefile,以使用交叉编译器arm-none-eabi-g++而不是arm-none-eabi-gcc;然而,由于一些奇怪的原因,我不断收到一个
无规则来生成target
错误。我删除了依赖项,只保留了启动代码和main,还尝试使用文件的绝对路径。但是,我继续收到错误消息。有人有什么建议吗

PROJECT_NAME=test-liv

BUILDDIR = build

LIBDIR = ../common
DEVICE = $(LIBDIR)/STM32F4xx
CORE = $(LIBDIR)/CMSIS
PERIPH = $(LIBDIR)/STM32F4xx_StdPeriph_Driver
PROJHEADERS = inc
PROJ_LIBDIR = lib

#SOURCES = src/main.cpp
SOURCES = startup_stm32f4xx.S
SOURCES += system_stm32f4xx.c
SOURCES += LibraryHacks.cpp

SOURCES += src/main.cpp
#SOURCES += $(PERIPH)/src/
#PROJECT SOURCES
#SOURCES += $(PROJ_LIBDIR)/src/


OBJECTS = $(addprefix $(BUILDDIR)/, $(addsuffix .o, $(abspath $(basename $(SOURCES)))))

INCLUDES += -I$(DEVICE) \
            -I$(PROJHEADERS) \
            -I$(CORE) \
            -I$(PERIPH)/inc \
            -I$(PROJ_LIBDIR)/inc \
            -Isrc \
            -I.

ELF = $(BUILDDIR)/$(PROJECT_NAME).elf
HEX = $(BUILDDIR)/$(PROJECT_NAME).hex
BIN = $(BUILDDIR)/$(PROJECT_NAME).bin

CXX = arm-none-eabi-g++
LD = arm-none-eabi-g++
AR = arm-none-eabi-ar
OBJCOPY = arm-none-eabi-objcopy
GDB = arm-none-eabi-gdb
SIZE = arm-none-eabi-size

CXXFLAGS  = -O0 -g -Wall -I.\
   -std=c++11 -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork \
   -mfpu=fpv4-sp-d16 -mfloat-abi=hard \
   $(INCLUDES) -DUSE_STDPERIPH_DRIVER

SEMIHOSTING_FLAGS = --specs=rdimon.specs -lc -lrdimon

LDSCRIPT = stm32_flash.ld
LDFLAGS += -T$(LDSCRIPT) -mthumb -mcpu=cortex-m4 

$(BIN): $(ELF)
    $(OBJCOPY) -O binary $< $@

$(HEX): $(ELF)
    $(OBJCOPY) -O ihex $< $@

$(ELF): $(OBJECTS)
    $(LD) $(LDFLAGS) $(CFLAGS) $(SEMIHOSTING_FLAGS) -o $@ $(OBJECTS) $(LDLIBS)
    $(SIZE) $@

$(BUILDDIR)/%.o: %.c
    mkdir -p $(dir $@)
    $(CXX) -c $(CXXFLAGS) $< -o $@

$(BUILDDIR)/%.o: %.S
    mkdir -p $(dir $@)
    $(CXX) -c $(CXXFLAGS) $< -o $@

flash: $(BIN)
    st-flash write $(BIN) 0x8000000

debug: $(ELF)
    $(GDB) -tui $(ELF)

openocd: $(ELF)
    openocd -f board/stm32f4discovery.cfg

all: $(HEX) $(BIN) $(ELF)

functions: all

.PHONY: clean
clean:
    rm -rf build
这条规则:

$(BUILDDIR)/%.o: %.c
描述如何从
foo.c
创建文件
$(BUILDDIR)/foo.o
。但是您现在想要编译一个
.cpp
文件。仅将配方中的编译器变量从
$(CC)
更改为
$(CXX)
不会更改目标或先决条件的描述!您需要添加一条新规则,告诉make如何编译
.cpp
文件:

$(BUILDDIR)/%.o: %.cpp
        mkdir -p $(dir $@)
        $(CXX) -c $(CXXFLAGS) $< -o $@
$(BUILDDIR)/%.o:%.cpp
mkdir-p$(dir$@)
$(CXX)-c$(CXXFLAGS)$<-o$@

此外,您可能应该将
$(CC)
编译调用放回
%.c
配方中;用C++编译器编译C代码通常不是一个好主意。

它们在路径中也没有空格,如果你使用这个MaX文件,用ARME EABI GCC替换ARM-非EABI G++,它工作,正确吗?当项目只有C是的,但是现在,当切换回arm none eabi gcc并将标志修改为c99时,它会给我完全相同的输出。好吧,您有一个规则从
.c
文件生成
.o
文件,紧接着一个规则从
.S
文件生成
.o
文件,并且明显缺少与
.cpp
文件相关的任何内容。您是否以禁用的方式调用make(或使用没有隐式
%.o:%.cpp
规则的版本生成)?内置隐式规则不会有帮助,因为他不想生成
%.o
来自
%.cpp
,他想生成
$(BUILDDIR)/%.o
来自
%.cpp
,这是完全不同的谢谢你,一切都正确地建立了,现在我用了GCC C和ASM文件,C++用C++文件。我不会意识到这个错误。
$(BUILDDIR)/%.o: %.cpp
        mkdir -p $(dir $@)
        $(CXX) -c $(CXXFLAGS) $< -o $@