Forum: Mikrocontroller und Digitale Elektronik Include-Pfade im Makefile


von Peter (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei ein Bare Metal Projekt mit der 
Standard-Peripheral-Library für einen STM32F103 aufzusetzen.

Da ich die Verzeichnisstruktur beibehalten möchte, habe ich bei der 
StdPeriphLib am Ende einen inc- und ein src-Verzeichnis:
std_periph_lib/inc/
std_periph_lib/src/

Die c-Dateien includieren die Header immer in etwa so (Beispiel misc.c):
#include "misc.h"

Wenn ich das ganze jetzt mit einem einfachen Makefile compilieren und 
linken möchte, habe ich immer das Problem, dass ich einen Fehler bei den 
Includes erhalte, da der Pfad ja eigentlich ../inc/ lauten müsste.

In den Beispielen, die ich gefunden habe wird auf den Erhalt der 
Verzeichnisstruktur verzichtet und einfach alles in einen Ordner 
kopiert.
Das wollte ich aber nicht, wie gesagt.

Eine IDE benutze ich nicht, in der ich allgemeine Suchpfade einstellen 
könnte.

Frage:
Kann man das irgendwie im Makefile 'zurecht biegen'?
Falls ja, wie geht das?

Ein ganz einfaches Beispiel wäre nett.

Danke, Peter

von Stefan E. (sternst)


Lesenswert?

Peter schrieb:
> Kann man das irgendwie im Makefile 'zurecht biegen'?
> Falls ja, wie geht das?

Indem du dem Compileraufruf dort eine entsprechende Option mitgibst.
-I oder -iquote

von Markus F. (mfro)


Lesenswert?

1
INCPATH=-I../inc
2
CFLAGS=$(CFLAGS) $(INCPATH)

von Markus M. (mmax)


Lesenswert?

Schau dir mal folgendes GitHub repo an:
https://github.com/ObKo/stm32-cmake

von Peter (Gast)


Lesenswert?

Danke schonmal für die bisherige Hilfe, aber ich kenne mich einfach 
(noch) zu wenig aus.

Den Aufruf von make starte ich in der obersten Ebene. Als Ergebnis 
erhalte ich einen Compilerfehler in
stm32f10x_rcc.c:

"stm32f10x_rcc.c:23:27: fatal error: stm32f10x_rcc.h: No such file or 
directory"

Das ist mein Makefile (eigentlich gehts erstmal nur darum das 
compilieren / linken von der stm32f10x_rcc.c Datei richtig einzubinden).

Makefile:
1
CC      = arm-none-eabi-gcc
2
LD      = arm-none-eabi-ld -v
3
CP      = arm-none-eabi-objcopy
4
OD    = arm-none-eabi-objdump
5
  
6
CFLAGS  =  -I./ -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb 
7
LFLAGS  = -Tstm32f103_rom.cmd -nostartfiles
8
CPFLAGS = -Obinary
9
ODFLAGS  = -S
10
11
STD_PERIPH_LIB_INC_DIR = STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc
12
STD_PERIPH_LIB_SRC_DIR = STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src
13
INCLUDE_DIR = -I./$(STD_PERIPH_LIB_INC_DIR)
14
BUILD_DIR = Build
15
INCPATH=-I../inc
16
CFLAGS += $(INCPATH)
17
18
_DEPS = stm32f10x_rcc.h
19
DEPS = $(patsubst %,$(INCLUDE_DIR)/%,$(_DEPS))
20
21
_OBJ = main.o stm32f10x_rcc.o 
22
OBJ = $(patsubst %,$(BUILD_DIR)/%,$(_OBJ))
23
24
all: test
25
26
clean:
27
  -rm main.list main.bin main.o main.out stm32f10x_rcc.o stm32f10x_gpio.o crt.lst a.lst crt.o main.hex main.map main.lst 
28
29
test: main.out
30
  @ echo "...copying"
31
  $(CP) $(CPFLAGS) main.out main.bin
32
  $(OD) $(ODFLAGS) main.out > main.list
33
34
main.out: main.o stm32f10x_rcc.o stm32f103_rom.cmd 
35
  @ echo "..linking"
36
  $(LD) $(LFLAGS) -o main.out main.o 
37
38
stm32f10x_rcc.o: $(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c 
39
  @ echo ".compil"
40
  @ echo "INC_PATH = " $(INCLUDE_DIR)
41
   $(CC) $(CFLAGS) -I../inc $(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c 
42
   
43
#stm32f10x_gpio.o: stm32f10x_gpio.c
44
#  @ echo ".compili"
45
#   $(CC) $(CFLAGS) stm32f10x_gpio.c 
46
   
47
main.o: main.c
48
  @ echo ".compiling"
49
   $(CC) $(CFLAGS) main.c

Ich bitte das zum Teil konfuse Durcheinander zu entschuldigen (ich bin 
halt noch am ausprobieren).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter schrieb:
> LD      = arm-none-eabi-ld -v

Hat nicht mit deinem Problem zu tun, aber mit ziemlicher Sicherheit 
willst du $CC als Linker-treiber verwenden und ld nicht von Hand 
aufrufen!  Schau dir einfach mal an, was gcc alles an Optionen an den 
Linker übergibt (z.B. mit -V -Wl,-v), das willst garantier nicht 
nachbasteln :-)

von M. (Gast)


Lesenswert?

Peter schrieb:
> stm32f10x_rcc.o: $(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c
>   @ echo ".compil"
>   @ echo "INC_PATH = " $(INCLUDE_DIR)
>    $(CC) $(CFLAGS) -I../inc $(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c

letzte Zeile ergänzen um "-I$(INCLUDE_DIR)", dann müsste es laufen:
    $(CC) $(CFLAGS) -I../inc -I$(INCLUDE_DIR) 
$(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c

von Peter (Gast)


Lesenswert?

M. schrieb:
> letzte Zeile ergänzen um "-I$(INCLUDE_DIR)", dann müsste es laufen:
>     $(CC) $(CFLAGS) -I../inc -I$(INCLUDE_DIR)
> $(STD_PERIPH_LIB_SRC_DIR)/stm32f10x_rcc.c

Irgendwann sieht man vor lauter Bäumen den Wald nicht mehr. Irgendwo 
einen Punkt (.) oder einen Slash zuviel (/) und die Pfadangaben stimmen 
nicht.

Ich hatte zwischenzeitlich den Include-Pfad mit -I/$(INCLUDE_DIR) 
ergänzt ... und genau das wars dann ja auch.

Vielen Dank nochmal. Es geht jetzt!

Gruß Peter

von Peter (Gast)


Lesenswert?

Johann L. schrieb:
> Peter schrieb:
>> LD      = arm-none-eabi-ld -v
>
> Hat nicht mit deinem Problem zu tun, aber mit ziemlicher Sicherheit
> willst du $CC als Linker-treiber verwenden und ld nicht von Hand
> aufrufen!  Schau dir einfach mal an, was gcc alles an Optionen an den
> Linker übergibt (z.B. mit -V -Wl,-v), das willst garantier nicht
> nachbasteln :-)

Warum will ich das nicht?

Ich habe das (zugegebenermaßen einfache) Demo-Projekt am laufen - mit LD 
als Linker.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.