hi m.a.r.v.i.n,
das sind die einzigen zeilen im makefile die mit CFLAGS anfangen:
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -I./inc
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
Druckbare Version
hi m.a.r.v.i.n,
das sind die einzigen zeilen im makefile die mit CFLAGS anfangen:
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -I./inc
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
Hi inka,
nicht im Makefile der AsuroLib, sondern im Makefile des Projekts muß man die Änderungen machen.
hi marvin,
so sieht das makefile für das letzte projekt das ich compiliert habe aus:
/Code:###############################################################################
# Makefile for the project test_lib_2_7
###############################################################################
## General Flags
PROJECT = test_lib_2_7
MCU = atmega8
TARGET = test_lib_2_7.elf
CC = avr-gcc.exe
## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)
## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -DF_CPU=8000000UL -Os -fsigned-char
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=
## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom
HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0
## Include Directories
INCLUDES = -I"Y:\georg\hobby\roboter\asuro\_asuro_lib\2_7_rc3\AsuroLib\lib\inc"
## Objects that must be built in order to link
OBJECTS = test_lib_2_7.o asuro.o switches.o time.o inka.o leds.o encoder.o globals.o motor_low.o motor.o encoder_low.o print.o uart.o
## Objects explicitly added by the user
LINKONLYOBJECTS =
## Build
all: $(TARGET) test_lib_2_7.hex test_lib_2_7.eep size
## Compile
test_lib_2_7.o: ../test_lib_2_7.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
asuro.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/asuro.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
switches.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/switches.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
time.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/time.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
inka.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/inka.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
leds.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/leds.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
encoder.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/encoder.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
globals.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/globals.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
motor_low.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/motor_low.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
motor.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/motor.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
encoder_low.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/encoder_low.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
print.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/print.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
uart.o: ../../../_asuro_lib/2_7_rc3/AsuroLib/lib/uart.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
##Link
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
%.eep: $(TARGET)
avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@
%.lss: $(TARGET)
avr-objdump -h -S $< > $@
size: ${TARGET}
@echo
@avr-size -C --mcu=${MCU} ${TARGET}
## Clean target
.PHONY: clean
clean:
-rm -rf $(OBJECTS) test_lib_2_7.elf dep/* test_lib_2_7.hex test_lib_2_7.eep
## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep*)
da weiss ich aber auch nicht wo ich die änderungen machen sollte :-(
Hi inka,
ok, verstehe. Du hast dir das Makefile vom AVR Studio zusammen basteln lassen. Das wäre eine weitere Möglichkeit. Allerdings wird dann nicht die libasuro.a mit eingebunden, sondern alle Quellfiles einzeln, aber egal.
Das einzige was mir daran auffällt, sind die Backslashes bei
Vielleicht stolpert der AVR-GCC darüber. Probiers mal mit Slashes.Code:## Include Directories
INCLUDES = -I"Y:\georg\hobby\roboter\asuro\_asuro_lib\2_7_rc3\AsuroLib\lib\inc"
oder mit relativen Pfadangaben, wie bei den Sourcefiles.Code:## Include Directories
INCLUDES = -I"Y:/georg/hobby/roboter/asuro/_asuro_lib/2_7_rc3/AsuroLib/lib/inc"
Code:## Include Directories
INCLUDES = -I"../../../_asuro_lib/2_7_rc3/AsuroLib/lib/inc"
ok, danke erstmal m.a.r.v.i.n,
werde ich heute abend ausprobieren.
Aus der o.a. makefile und dem geschriebenem ergeben sich noch folgende fragen:
- das makefile wird beim anlegen eines jeden neuen projektes von AVR neu erzeugt?
- wonach? habe ich eine chance dass die änderungen die ich hier machen muss automatisch bei neuen projekten übernommen werden?
- wie wird da eigentlich die myasuro.h eingebunden? Die asuro.h steht ja in der asuro.c, so kommt die ja wohl rein, aber was passiert bei der myasuro? wird das mit dem includen der verzeichnisse gemacht? Für alle *.h dateien die in dem verzeichnis sind?
Es ist noch ein ziemlich dichter dschungel für mich :-(
das kompileieren der datei verlief nach dem ändern der backslashes in slashes problemlos, keine fehlermeldungen. Ob nun die myasuro.h berücksichtigt wurde weiss ich nicht. Der ablauf des programmes änderte sich m.e. nach nicht...
Wie kann ich das überprüfen?
btw: aus den slashes wurden nach der kompilierung wieder backslashes...
Header-Dateien sind das Deklarations-Futter für xxx.c (Sourcecode) oder xxx.lib (statische Bibliotheken). Schau mal in die xxx.c, die myasuro.h benötigen, z.B. asuro.c, encoder.c oder switches.c. Dort wirst Du myasuro.h finden.
Zunächst sollte man verstehen, wie eine ausführbare binäre Datei aus Sourcecode entsteht. Hierzu verwendet man wahrscheinlich unbewusst drei Werkzeuge:
Precompiler / Präprozessor
Compiler
Linker
Der Precompiler / Präprozessor durchforstet den Sourcecode, um spezielle Anweisungen auszuführen. Diese Anweisungen beginnen mit #.
In unserem Beispiel erkennt der Precompiler z.B. #include "asuro.h" und setzt an dieser Stelle den entsprechenden Sourcecode des Headers ein. Auf diese Weise wird der gesamte Sourcecode bearbeitet, also auch alle #define ... ... ersetzt.
Der resultierende Sourcecode wird dem Compiler übergeben. Dieser erzeugt dann Objektdateien (xxx.o).
Diese werden vom Linker zusammen mit statischen Bibliotheken in eine lauffähige Programmdatei überführt.
Bei MS Windows gibt es noch dynamische Bibliotheken (dll), die erst während der Ausführung des Programms - also dynamisch - gebunden werden ( http://www.henkessoft.de/C++/WinAPI/...s%206/api6.htm ).