2016-05-09 2 views
1

J'essaie de créer un projet makefile en utilisant la bibliothèque mbed pour l'utiliser dans un projet plus important que je souhaite effectuer plus tard. Je le répertoire du projet mis en place comme ça ...La bibliothèque n'inclut pas de détection d'en-tête dans le chemin d'inclusion

. 
|-- 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 

Plus précisément, mon erreur est dans lib/mbed/platform.h, qui tente d'inclure device.h. J'ai un makefile qui devrait l'ajouter au chemin include, mais g ++ semble toujours incapable de le trouver. Voici l'erreur exacte ...

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 

Ligne 1 de main.cc est #include "../lib/mbed/mbed.h"

NUCLEO_F446RE.mk définit le comprennent spécifique à l'appareil chemin que je me sers, et j'espère pouvoir être en mesure de choisir le fichier .mk à utiliser en fonction d'une variable que je passe au makefile, de sorte que je puisse facilement utiliser une autre carte mbed si je le souhaite. Voici le contenu de NUCLEO_F446RE.mk ...

HARDFP = 1 

LIBRARY_PATHS = -L./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM 

CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI) 

LINKER_SCRIPT = ./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/STM32F446XE.ld 

CC_SYMBOLS = -DTARGET_M4 -DMBED_BUILD_TIMESTAMP=1453683815.81 -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -DTARGET_RTOS_M4_M7 -DTARGET_FF_MORPHO -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_FF_ARDUINO -DTARGET_STM32F446RE -DTARGET_NUCLEO_F446RE -D__MBED__=1 -DTARGET_STM -DTARGET_STM32F4 -D__CORTEX_M4 -DARM_MATH_CM4 

INCLUDE_PATHS = -I./lib/ -I./lib/mbed/ \ 
-I./lib/mbed/TARGET_NUCLEO_F446RE/ \ 
-I./lib/mbed/TARGET_NUCLEO_F44\6RE/TARGET_STM/ \ 
-I./lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/ \ 
-I./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/ \ 
-I./lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446RE/ #<--device.h is here 

SYS_OBJECTS = ./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o \ 
./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/board.o \ 
... 

Pour faire bonne mesure, voici mon makefile. J'ai essayé de garder tout aussi propre que possible.

#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/[email protected] $< 

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

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

obj/%.o: %.asm 
     $(CC) $(CPU) -c -x assembler-with-cpp -o asm/[email protected] $< 

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

$(PROJECT).bin: $(PROJECT).elf 
     $(OBJCOPY) -O binary $< [email protected] 

$(PROJECT).hex: $(PROJECT).elf 
     @$(OBJCOPY) -O ihex $< [email protected] 

$(PROJECT).lst: $(PROJECT).elf 
     @$(OBJDUMP) -Sdh $< > [email protected] 

lst: $(PROJECT).lst 

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

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) 
-include $(DEPS) 

Une grande partie du code que j'ai ici est basé sur la sortie de l'IDE mbed en ligne après l'exportation d'un projet simple à un makefile. Cependant, l'export avait tout dans un seul répertoire, et ce sera extrêmement compliqué car je commence à faire de plus gros projets et éventuellement à ajouter plus de bibliothèques. Ce qui est étrange, c'est que ce projet se compile sans erreur quand j'utilise la version exportée mono-répertoire. Que se passe-t-il ici? Pourquoi g ++ ne voit-il pasdevice.hdans ma version multi-répertoire?

EDITS 2016-05-09: Modifications mineures à makefile, même erreur.

Répondre

0
%.o: %.cc %.cpp 

Cette règle de modèle est (probablement) incorrect, vous dire faire appliquer cette règle si et seulement si les fichiers .cc et Cpp existent (ou peuvent être faites par d'autres règles). Comme main.cpp n'existe probablement pas, make va revenir à sa règle implicite intégrée, qui ne connaîtra évidemment pas INCLUDE_PATHS ou toute autre variable non conventionnelle que vous utilisez pour les drapeaux.

Vous pouvez corriger ce problème en deux règles distinctes

%.o: %.cc 
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/[email protected] $< 
%.o: %.cpp 
    $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o obj/[email protected] $< 

Ces règles sont encore brisées cependant, comme lorsque l'un d'entre eux correspond à quelque chose comme ./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o vous allez le placer dans obj/./lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o, ce qui signifie faire va toujours recompiler l'objet car il ne sera pas là où vous l'avez dit (consultez le Rules of Makefiles informel, en particulier 2).

+0

J'ai corrigé le problème '% .o' et j'ai essayé de supprimer tous les' ./'' de 'NUCLEO_F446RE.mk'. Il me donne toujours la même erreur. Dois-je créer des règles distinctes pour gérer les fichiers objet mbed? –

+0

@CalebReister Une faute de frappe peut-être? Je devine '-include $ (CIBLE) _mbed.mk' devrait être' include $ (TARGET) .mk', et se débarrasser du '-' il masquait l'erreur. Supprimer le '. /' Ne vous aidera pas avec le second problème, le problème est que vous envoyez les objets à 'obj/$ @' mais votre règle dit que vous les éditez en '% .o' (qui est' $ @ '). – user657267

+0

J'ai corrigé le premier problème et corrigé une erreur de syntaxe dans '$ (TARGET) .mk'. Le deuxième problème s'avère plus compliqué.Je vais mettre à jour mon message avec de nouvelles informations. –