Forum: Mikrocontroller und Digitale Elektronik Universelle CAN Bibliothek: undefined reference to `can_init'


von Karlo (Gast)


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

von felixw (Gast)


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

von Michelle K. (Firma: electronica@tdnet) (michellekonzack) Benutzerseite


Lesenswert?

Es gibt compiler die das nicht mögen:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include "can.h"
    #include "config.h"

vieleicht geht es mit

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <can.h>
    #include <config.h>

Grüße
Michelle

von Hugi (Gast)


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

von felixw (Gast)


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

von Markus (Gast)


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

von MArkus S. (markus1991)


Lesenswert?

Könnt ihr mir weiterhelfen mit dem makefile und der libcan.a?

Das versteh ich ganz und gar nicht. was muss ich da machen?

von Markus F. (mfro)


Lesenswert?

MArkus S. schrieb:
> Könnt ihr mir weiterhelfen mit dem makefile und der libcan.a?
>
> Das versteh ich ganz und gar nicht. was muss ich da machen?

Steht drei Beiträge über deinem.

von MArkus S. (markus1991)


Lesenswert?

Ich versteh es trotz allem nicht...

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
Noch kein Account? Hier anmelden.