Forum: Compiler & IDEs undefined reference to?


von qwertz (Gast)


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

von Peter II (Gast)


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.

von Karl H. (kbuchegg)


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.

von qwertz (Gast)


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?

von Rosa-Kleidchen (Gast)


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

von qwertz (Gast)


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?

von qwertz (Gast)


Lesenswert?

ich habe nun in der spi.h den Prototype folgendermaßen abgeändert:

extern "C" uint8_t spi_putc(uint8_t data);

Fehler: expected identifier or '(' before string constant

Was mache ich falsch?

von Karl H. (kbuchegg)


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
}

von qwertz (Gast)


Lesenswert?

Danke! :)

Mein Hauptproblem ist zwar immer noch nicht gelöst,
aber der Funktionsaufruf klappt nun.

von Rosa-Kleidchen (Gast)


Lesenswert?

Wenn das Problem immer noch besteht:
Disassembliere doch mal das Binary- oder Elf-File und suche nach 
'spi_putc'. Mal schauen, ob Du die findest.
Rosa

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.