Universelle CAN Bibliothek: undefined reference to `can_init'

Gast #2024265
Lesenswert?

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
Gast #2228106
Lesenswert?

Hallo Karlo,

ich richte bei mir gerade die CAN-Bibliothek ein und bekomme den 
gleichen Fehler.
Hast Du rausgefunden an was das liegt?

Wäre toll, wenn Du mir weiterhelfen könntest.


Grüße,

FelixW
Gast #2228163
Lesenswert?

Karlo schrieb:
> Ich habe die Bibliothek erzeugt und libcan.a eingebunden.

Ich mache dass immer direkt in den Properties des Projektes im 
AVR-Studio, deshalb schlagt mich nicht gleich.
Müsste im Makefile aber nicht irgendwo auch stehen wo er die Library 
findet.
Sonst weis ja der Linker nicht weiter...

Bei mir steht da noch was wie das hier drin:
1
## Library Directories
2
LIBDIRS = -L"F:\Pfad_zur_Lib\." 
3

4
## Libraries
5
LIBS = -lcan

Grüße
Gast #2229748
Lesenswert?

Hallo zusammen,

danke für eure Antworten. Habe den Fehler gefunden. Im AVR-Studio muss 
unter den Configuration Options jeweils für die Library und Include 
Directories der Pfad angegeben werden. Das muss man auch dann machen, 
wenn die entsprechenden Dateien im Projektordner liegen! Kopiert man 
also die libcan.a, can.h und config.h in den Projektordner, so lautet 
der Library- und Include File Search Path jeweils ".\"

Viele Grüße,

Felix
Gast #3968039
Lesenswert?

Hallo

Ich habe auch das Problem für alle Funktionen diesen Error bekomme

undefined reference to `can_get_message'

Makefile und config habe ich angepasst und dann die Bib erstellt.

Ich arbeite mit Atmel Studio 6 und habe die Dateien dann über den 
Solution Explorer eingebunden

einmal mit Exsiting item und die Bib mit Add Library.

Im Toolchain -> Linker ist dann auch der Ort der Bib angegeben.

Hat jemand vielleicht eine Tipp für mich

Danke

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren