mikrocontroller.net

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


Autor: Karlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "can.h"
#include "config.h"




int main (void) {

  //enable the global interrupts
  sei();

  do{

  
    // initialisieren des MCP2515
    can_init(BITRATE_125_KBPS);
  
    // erzeuge eine Testnachricht
    can_t msg;
  
    msg.id = 0x123456;
    msg.flags.rtr = 0;
  
    msg.length = 4;
    msg.data[0] = 0xde;
    msg.data[1] = 0xad;
    msg.data[2] = 0xbe;
    msg.data[3] = 0xef;
  
    // Nachricht verschicken
    can_send_message(&msg);


  } while (1);

return 0;
}


Makefile:
##############################################################################
# Makefile for the project CAN_OBD
###############################################################################

## General Flags
PROJECT = CAN_OBD
MCU = atmega32
TARGET = CAN_OBD.elf
CC = avr-gcc

CPP = avr-g++

## 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 -std=gnu99                   -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -Wl,-Map=CAN_OBD.map
LDFLAGS += -L. -lcan        

## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = main.o 

## Objects explicitly added by the user
LINKONLYOBJECTS = 

## Build
all: $(TARGET) CAN_OBD.hex CAN_OBD.eep CAN_OBD.lss size

## Compile
main.o: ../main.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 $< $@ || exit 0

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

size: ${TARGET}
  @echo
  @avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) CAN_OBD.elf dep/* CAN_OBD.hex CAN_OBD.eep CAN_OBD.lss CAN_OBD.map


## Other dependencies
-include $(shell mkdir dep 2>NUL) $(wildcard dep/*)


Gruß
Karlo

Autor: felixw (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michelle Konzack (Firma: electronica@tdnet) (michellekonzack) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hugi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
## Library Directories
LIBDIRS = -L"F:\Pfad_zur_Lib\." 

## Libraries
LIBS = -lcan 

Grüße

Autor: felixw (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MArkus S. (markus1991)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MArkus S. (markus1991)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versteh es trotz allem nicht...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.