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
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.
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.
> 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?
>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
> ??? 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?
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?
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 | }
|
Danke! :) Mein Hauptproblem ist zwar immer noch nicht gelöst, aber der Funktionsaufruf klappt nun.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.