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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.