Hi inka,
nicht im Makefile der AsuroLib, sondern im Makefile des Projekts muß man die Änderungen machen.
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
gruß inka
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
gruß inka
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
gruß inka
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...
gruß inka
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 ).
Lesezeichen