Hallo, ich bin gerade an einen Projekt mit einem Atmega32 + MCP2515. Ich benutze die Universelle CAN Bibliothek von kreatives-chaos.com: http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek Ich habe die Bibliothek erzeugt und libcan.a eingebunden. Wenn ich nun den Beispiel-Code aus der ReadMe kompilieren möchte, bekomme ich folgende Fehler: ../main.c:35: undefined reference to `can_init' ../main.c:50: undefined reference to `can_send_message' Mir ist nicht klar, woran die Fehler kommen. Wäre super, wenn mir jemand weiterhelfen könnte. Code:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdlib.h> |
4 | #include "can.h" |
5 | #include "config.h" |
6 | |
7 | |
8 | |
9 | |
10 | int main (void) { |
11 | |
12 | //enable the global interrupts
|
13 | sei(); |
14 | |
15 | do{ |
16 | |
17 | |
18 | // initialisieren des MCP2515
|
19 | can_init(BITRATE_125_KBPS); |
20 | |
21 | // erzeuge eine Testnachricht
|
22 | can_t msg; |
23 | |
24 | msg.id = 0x123456; |
25 | msg.flags.rtr = 0; |
26 | |
27 | msg.length = 4; |
28 | msg.data[0] = 0xde; |
29 | msg.data[1] = 0xad; |
30 | msg.data[2] = 0xbe; |
31 | msg.data[3] = 0xef; |
32 | |
33 | // Nachricht verschicken
|
34 | can_send_message(&msg); |
35 | |
36 | |
37 | } while (1); |
38 | |
39 | return 0; |
40 | }
|
Makefile:
1 | ##############################################################################
|
2 | # Makefile for the project CAN_OBD
|
3 | ###############################################################################
|
4 | |
5 | ## General Flags
|
6 | PROJECT = CAN_OBD |
7 | MCU = atmega32 |
8 | TARGET = CAN_OBD.elf |
9 | CC = avr-gcc |
10 | |
11 | CPP = avr-g++ |
12 | |
13 | ## Options common to compile, link and assembly rules
|
14 | COMMON = -mmcu=$(MCU) |
15 | |
16 | ## Compile options common for all C compilation units.
|
17 | CFLAGS = $(COMMON) |
18 | CFLAGS += -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums |
19 | CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d |
20 | |
21 | ## Assembly specific flags
|
22 | ASMFLAGS = $(COMMON) |
23 | ASMFLAGS += $(CFLAGS) |
24 | ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 |
25 | |
26 | ## Linker flags
|
27 | LDFLAGS = $(COMMON) |
28 | LDFLAGS += -Wl,-Map=CAN_OBD.map |
29 | LDFLAGS += -L. -lcan |
30 | |
31 | ## Intel Hex file production flags
|
32 | HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature |
33 | |
34 | HEX_EEPROM_FLAGS = -j .eeprom |
35 | HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" |
36 | HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings |
37 | |
38 | |
39 | ## Objects that must be built in order to link
|
40 | OBJECTS = main.o |
41 | |
42 | ## Objects explicitly added by the user
|
43 | LINKONLYOBJECTS = |
44 | |
45 | ## Build
|
46 | all: $(TARGET) CAN_OBD.hex CAN_OBD.eep CAN_OBD.lss size |
47 | |
48 | ## Compile
|
49 | main.o: ../main.c |
50 | $(CC) $(INCLUDES) $(CFLAGS) -c $< |
51 | |
52 | ##Link
|
53 | $(TARGET): $(OBJECTS) |
54 | $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET) |
55 | |
56 | %.hex: $(TARGET) |
57 | avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ |
58 | |
59 | %.eep: $(TARGET) |
60 | -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0 |
61 | |
62 | %.lss: $(TARGET) |
63 | avr-objdump -h -S $< > $@ |
64 | |
65 | size: ${TARGET} |
66 | @echo |
67 | @avr-size -C --mcu=${MCU} ${TARGET} |
68 | |
69 | ## Clean target
|
70 | .PHONY: clean |
71 | clean: |
72 | -rm -rf $(OBJECTS) CAN_OBD.elf dep/* CAN_OBD.hex CAN_OBD.eep CAN_OBD.lss CAN_OBD.map |
73 | |
74 | |
75 | ## Other dependencies
|
76 | -include $(shell mkdir dep 2>NUL) $(wildcard dep/*) |
Gruß Karlo