Makefile 库包含未在包含路径中检测头

Makefile 库包含未在包含路径中检测头,makefile,g++,include-path,mbed,Makefile,G++,Include Path,Mbed,我正在尝试使用mbed库设置一个makefile项目,以便在以后要做的更大的项目中使用。我有这样的项目目录设置 . |-- Doxyfile |-- NUCLEO_F446RE.mk |-- Nucleo_blink.map |-- asm |-- attach.gdb |-- debug |-- gdb-pipe.cfg |-- lib | `-- mbed | |-- AnalogIn.h | |-- ... | |-- TARGET_NUCLEO_F

我正在尝试使用mbed库设置一个makefile项目,以便在以后要做的更大的项目中使用。我有这样的项目目录设置

.
|-- Doxyfile
|-- NUCLEO_F446RE.mk
|-- Nucleo_blink.map
|-- asm
|-- attach.gdb
|-- debug
|-- gdb-pipe.cfg
|-- lib
|   `-- mbed
|       |-- AnalogIn.h
|       |-- ...
|       |-- TARGET_NUCLEO_F446RE
|       |   |-- TARGET_STM
|       |   |   `-- TARGET_STM32F4
|       |   |       |-- PeripheralPins.h
|       |   |       |-- TARGET_NUCLEO_F446RE
|       |   |       |   |-- PeripheralNames.h
|       |   |       |   |-- PinNames.h
|       |   |       |   |-- PortNames.h
|       |   |       |   |-- device.h
|       |   |       |   `-- objects.h
|       |   |       `-- gpio_object.h
|       |   |-- TOOLCHAIN_GCC_ARM
|       |   |   |-- STM32F446XE.ld
|       |   |   |-- board.o
|       |   |   |-- ...
|       |   |   `-- system_stm32f4xx.o
|       |   |-- arm_common_tables.h
|       |   |-- ...
|       |   `-- system_stm32f4xx.h
|       |-- Ticker.h
|       |-- ...
|       `-- wait_api.h
|-- makefile
|-- obj
|-- release
`-- src
    `-- main.cc
具体来说,我的错误在
lib/mbed/platform.h
中,它试图包括
device.h
。我有一个makefile,它应该将它添加到include路径,但是g++似乎仍然无法找到它。这里是准确的错误

arm-none-eabi-g++    -c -o main.o source/main.cc
In file included from source/../lib/mbed/mbed.h:21:0,
                from source/main.cc:1:
source/../lib/mbed/platform.h:21:20: fatal error: device.h: No such file or directory
#include "device.h"
                    ^
compilation terminated.
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1
这是我的makefile。我一直在努力使一切尽可能整洁

#Project parameters
PROJECT = Nucleo_blink
OBJECTS = main.o
DEST    = debug
VPATH   = src lib $DEST
TARGET  = NUCLEO_F446RE

#Compilation options
DEBUG = 1

#Tools
AS      = $(GCC_BIN)arm-none-eabi-as
CC      = $(GCC_BIN)arm-none-eabi-gcc
CXX     = $(GCC_BIN)arm-none-eabi-g++
LD      = $(GCC_BIN)arm-none-eabi-gcc
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
SIZE    = $(GCC_BIN)arm-none-eabi-size 

include $(TARGET).mk

CFLAGS = $(INCLUDE_PATHS) $(CC_SYMBOLS) $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP

ifeq ($(HARDFP),1)
        FLOAT_ABI = hard
else
        FLOAT_ABI = softfp
endif

ifeq ($(DEBUG), 1)
        CFLAGS += -DDEBUG -O0
else
        CFLAGS += -DNDEBUG -Os
endif

LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys

LIBRARIES = -lmbed 

.PHONY: all clean lst size

all: $(PROJECT).bin $(PROJECT).hex

clean:
        rm -f debug/* obj/* asm/* $(DEPS)

obj/%.o: %.c #<---Attempt to fix target error mentioned by @user657267
        $(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=c99 $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.cc
        $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.cpp
        $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<

obj/%.o: %.asm
        $(CC) $(CPU) -c -x assembler-with-cpp -o asm/$@ $<

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
        $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $(DEST)/$@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)

$(PROJECT).bin: $(PROJECT).elf
        $(OBJCOPY) -O binary $< $@

$(PROJECT).hex: $(PROJECT).elf
        @$(OBJCOPY) -O ihex $< $@

$(PROJECT).lst: $(PROJECT).elf
        @$(OBJDUMP) -Sdh $< > $@

lst: $(PROJECT).lst

size: $(PROJECT).elf
        $(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)
#项目参数
项目=核子闪烁
OBJECTS=main.o
DEST=调试
VPATH=src lib$DEST
目标=Nucleof446Re
#编译选项
调试=1
#工具
AS=$(GCC_-BIN)arm none eabi AS
CC=$(GCC_BIN)arm none eabi GCC
CXX=$(GCC_-BIN)arm-none-eabi-g++
LD=$(GCC_-BIN)arm none eabi GCC
OBJCOPY=$(GCC_BIN)arm none eabi OBJCOPY
OBJDUMP=$(GCC_BIN)arm none eabi OBJDUMP
大小=$(GCC_-BIN)arm none eabi大小
包括$(目标).mk
CFLAGS=$(包含路径)$(CC\u符号)$(CPU)-c-g-fno公共-fmessage length=0-Wall-Wextra-fno异常-ffunction节-fdata节-fomit帧指针-MMD-MP
ifeq($(硬FP),1)
浮动=硬
其他的
FLOAT_ABI=softfp
恩迪夫
ifeq($(调试),1)
CFLAGS+=-DDEBUG-O0
其他的
CFLAGS+=-DNDEBUG-Os
恩迪夫
LD_FLAGS=$(CPU)-Wl,--gc节--specs=nano.specs-u_printf\u float-u_scanf\u float-Wl,--wrap,main-Wl,-Map=$(项目).Map,--cref
LD_SYS_LIBS=-lstdc++-lsupc++-lm-lc-lgcc-lnosys
库=-lmbed
.假冒:所有清洁lst尺寸
全部:$(项目).bin$(项目).hex
清洁:
rm-f debug/*obj/*asm/*$(DEPS)
obj/%.o:%.c#$@
lst:$(项目).lst
大小:$(项目).elf
$(大小)$(项目).elf
DEPS=$(对象:.o=.d)$(系统对象:.o=.d)
-包括美元(DEPS)
我这里的很多代码都是基于在线mbed IDE将简单项目导出到makefile后的输出。然而,导出将所有内容都放在一个目录中,当我开始执行更大的项目并可能添加更多库时,这将非常混乱。奇怪的是,当我使用单目录导出版本时,这个项目编译时没有任何错误这是怎么回事?为什么g++在我的多目录版本中看不到设备.h

编辑2016-05-09:对makefile做了一些小调整,同样的错误

%.o: %.cc %.cpp
此模式规则(可能)不正确,您告诉make当且仅当.cc和.cpp文件都存在(或可以由其他规则创建)时才应用此规则。由于
main.cpp
可能不存在,make将退回到其内置的隐式规则,该规则显然不知道
INCLUDE\u路径
或用于标记的任何其他非常规变量

您可以通过将这两条规则分开来解决此问题

%.o: %.cc
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<
%.o: %.cpp
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<
%.o:%.cc
$(CXX)$(CC_标志)$(CC_符号)-std=c++98-fno rtti$(包含_路径)-o obj/$@$<
%.o:%.cpp
$(CXX)$(CC_标志)$(CC_符号)-std=c++98-fno rtti$(包含_路径)-o obj/$@$<
然而,这些规则仍然被打破,因为当其中一个规则匹配类似于
/lib/mbed/TARGET\u NUCLEO\u F446RE/toolschain\u GCC\u ARM/stm32f4xx\u hal\u flash\u ramfunc.o
时,您将把它放入
obj//lib/mbed/TARGET\u NUCLEO\u F446RE/toolschain\u GCC\u ARM/stm32f4xx\u flash\u ramfunc.o
,这意味着make将始终重新编译对象,因为它不会在您所说的应该在的位置(查看非正式的,特别是2)

此模式规则(可能)不正确,您告诉make当且仅当.cc和.cpp文件都存在(或可以由其他规则创建)时才应用此规则。由于
main.cpp
可能不存在,make将退回到其内置的隐式规则,该规则显然不知道
INCLUDE\u路径
或用于标记的任何其他非常规变量

您可以通过将这两条规则分开来解决此问题

%.o: %.cc
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<
%.o: %.cpp
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/$@ $<
%.o:%.cc
$(CXX)$(CC_标志)$(CC_符号)-std=c++98-fno rtti$(包含_路径)-o obj/$@$<
%.o:%.cpp
$(CXX)$(CC_标志)$(CC_符号)-std=c++98-fno rtti$(包含_路径)-o obj/$@$<

然而,这些规则仍然被打破,因为当其中一个规则匹配类似于
/lib/mbed/TARGET\u NUCLEO\u F446RE/toolschain\u GCC\u ARM/stm32f4xx\u hal\u flash\u ramfunc.o
时,您将把它放入
obj//lib/mbed/TARGET\u NUCLEO\u F446RE/toolschain\u GCC\u ARM/stm32f4xx\u flash\u ramfunc.o
,这意味着make将始终重新编译对象,因为它不会在您所说的位置(查看非正式的,特别是2)。

我修复了
%.o
问题,并尝试从
nucleof446re.mk
中删除所有
/
。它仍然给我同样的错误。我是否需要创建单独的规则来处理mbed对象文件?@CalebReister可能是打字错误?我猜
-include$(TARGET)\u mbed.mk
应该是
include$(TARGET).mk
,并且去掉
-
它掩盖了错误。删除
/
对第二个问题没有帮助,问题是您正在将对象输出到
obj/$@
,但是您的规则说您将它们输出到
%.o
(即
$@
)。我修复了第一个问题,并修复了
$(TARGET).mk
中的语法错误。第二个问题被证明更加复杂。我将用一些新信息更新我的帖子。@CalebReister这与您的makefile无关,但似乎是一样的。谢谢您的输入。然而,我仍然对obj/部分感到困惑。我让规则在
obj/%.o
中查找对象文件,但仍然得到相同的错误。这可能与库对象位于不同位置这一事实有关吗?我需要一个规则来处理它们吗?为什么头文件会在编译过程中使用到那么晚?我修正了这个问题