undefined reference to?

Gast #3206382
Lesenswert?

Hallo,

ich hab in einem Projekt eine bekannte und funktionierende CAN 
Bibliothek mit SPI in einem Unterordner "can" eingebunden.

Das bestehende Projekt nutzt allerdings auch schon das SPI Interface zur 
Kommunikation mit einem AD8400 (Digitalpoti) im Simplex Modus.
Diese Kommunikation wurde über eine Art Software SPI gelöst.

Leider funktioniert das Zusammenspiel beider nicht richtig, und ich 
möchte versuchen den AD8400 mit der SPI-Lösung der CAN Bibliothek 
anzusprechen (Hardware SPI).

Soweit so gut.

Jetzt kommt folgende Fehlermeldung:
undefined reference to `spi_putc(unsigned char)'

Ich habe alle nötigen header eingebunden.
Ich habe dem linker den "Library search path" von der CAN Bibl. genannt.

Die CAN dateien haben die Endung .c, meine Projektdatein die Endung 
.cpp, kann es damit zusammen hängen?

Nutz AVR Studio 5.1.208


Grüße
Gast #3206387
Lesenswert?

qwertz schrieb:
> Ich habe dem linker den "Library search path" von der CAN Bibl. genannt.
>
> Die CAN dateien haben die Endung .c, meine Projektdatein die Endung
> .cpp, kann es damit zusammen hängen?

wie jetzt? Ein Bibl. hat keine endung .c oder .cpp. Wenn es C/C++ 
Dateien sind dann braucht du kein "Library search path" sondern muss sie 
einfach zum Projekt dazunehmen.
#3206392
Lesenswert?

Peter II schrieb:
> qwertz schrieb:
>> Ich habe dem linker den "Library search path" von der CAN Bibl. genannt.
>>
>> Die CAN dateien haben die Endung .c, meine Projektdatein die Endung
>> .cpp, kann es damit zusammen hängen?
>
> wie jetzt? Ein Bibl. hat keine endung .c oder .cpp. Wenn es C/C++
> Dateien sind dann braucht du kein "Library search path" sondern muss sie
> einfach zum Projekt dazunehmen.

Exakt.
Das ganze hat damit zu tun, dass wir hier den Begriff 'Library' bzw. 
'Bibliothek' etwas schlampig verwenden. Bestenfalls könnte man noch von 
einer Source-Code Library sprechen. Aber mit dem, was im eigentlichen 
Sinne eine Library ausmacht hat das alles nicht viel zu tun.

Das andere könnte noch sein, dass dein Header File für diese 
CAN-Funktionen ein 'extern "C"' brauchen könnte, wenn dein Hauptprojekt 
ein C++ Projekt ist.
Denn der C++ Compiler, wenn er den Inhalt des Header Files sieht, geht 
von C++ Funktionen aus und verpasst denen ein Name-Mangling, während der 
C Compiler genau dieses nicht tut, wenn er can.c compiliert.
Gast #3206403
Lesenswert?

> Das andere könnte noch sein, dass dein Header File für diese
> CAN-Funktionen ein 'extern "C"' brauchen könnte, wenn dein Hauptprojekt
> ein C++ Projekt ist.

Wie genau stell ich das mit diesem 'extern "C"' an?
Was ist das?

Kann es noch an etwas anderem liegen, dass die o.g. Fehlermeldung 
auftritt?

...

Wenn ich in einem Projekt c und cpp Dateien nutze, muss ich dann den C 
und C++ Compiler einstellen?
z.B.: jeweils unter "Symbols" F_CPU=12000000 ?
Oder auch das Opimization Level ?
Oder reicht es diese Einstellungen einmalig vorzunehmen?
Gast #3206416
Lesenswert?

>Wenn ich in einem Projekt c und cpp Dateien nutze, muss ich dann den C
>und C++ Compiler einstellen?
???

>z.B.: jeweils unter "Symbols" F_CPU=12000000 ?
>Oder auch das Opimization Level ?
>Oder reicht es diese Einstellungen einmalig vorzunehmen?
???

Wenn Du ein C-File in einem C++-Projekt verwenden möchtest, brauchst Du 
in der Regel - wie Karl Heinz Buchegger schon bemerkt hat - ein 'extern 
"C"'!

Es kann aber auch sein, dass die Funktion spi_putc schlicht nicht 
existiert oder falsch geschrieben ist.
Rosa
Gast #3206423
Lesenswert?

> ???

Im AVR Studio gibt es verschieden Einstellungsmöglichkeiten für den C 
und für den C++ Compiler.

Ich wollte einfach nur wissen, ob es Sinn macht in einem C++ Projekt, 
mit eingebundenen C Dateien auch Einstellungen für den C Compiler zu 
setzen.
Aber anscheinend nicht...


> Es kann aber auch sein, dass die Funktion spi_putc schlicht nicht
> existiert oder falsch geschrieben ist.

Die Funktion existiert natürlich und wird auch von der eingebundenen CAN 
Source-Code Library erfolgreich genutzt.
Richtig geschrieben ist sie auch.

Wie genau stell ich das mit diesem 'extern "C"' an?
#3206453
Lesenswert?

qwertz schrieb:

> Was mache ich falsch?

Du zeigst deinen Problemcode immer nur in homöopathischen Dosen

can.h
1
#ifndef CAN_H_INCLUDED
2
#define CAN_H_INCLUDED
3

4
#include <stdint.h>
5

6
#ifdef __cplusplus 
7
extern "C" {
8
#endif
9

10
uint8_t spi_putc(uint8_t data);
11
.... andere Funktionsprotoypen bzw. Funktionen
12

13

14
#ifdef __cplusplus 
15
}
16
#endif
17
#endif

main.cpp
1
...
2
#include "can.h"
3

4
int main()
5
{
6
   ...
7

8
  spi_putc( 'a' )
9
}

can.c
1
...
2
#include "can.h"
3

4
....
5
uint8_t spi_putc(uint8_t data)
6
{
7
  ....
8
}

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