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
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
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).
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 :-)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.