Hallo Leute,
Danke schon mal im voraus an diejenigen, welche sich nun mit meinem
Problem beschäftigen:
Ich bin dabei mittels CMake ein hex-File für mein Arduino Yun Board
(atmega32u4) zu erstellen. Hier ist einmal mein Code:
------------------------------------------------------------------------
----
test.c:
1
#include<stdio.h>
2
#include"Arduino.h"
3
4
voidsetup(){
5
printf("Test");
6
}
7
8
voidloop(){
9
10
}
11
12
intmain(void)
13
{
14
init();//reference undefined?!?
15
setup();
16
for(;;)
17
{
18
loop();
19
}
20
return0;
21
}
------------------------------------------------------------------------
----
Der include der Arduino Header Datei sollte stimmen. Wenn ich die
init()-Methode auskommentiere, erhalte ich keinerlei Fehler und das hex
File wird erstellt. Jedoch wenn ich das hex File auf das Board lade,
kann man das Board über die Ports nicht mehr ansprechen =(.
Sofern jedoch die init-Methode aufgerufen wird, kommt es zu diesem
Fehler:
test.c:30: undefined reference to `init'
Mein toolchain und die CMakeLists-Textdatei habe ich in den Anhang
gepackt.
Kann sich jemand vorstellen woran es liegen kann? Könnte mir vorstellen,
dass ein include fehlt, aber ich weiß nicht welchen ich noch einfügen
könnte.
Beste Grüße
was soll init() denn machen?
Jonas Hamers schrieb:> test.c:30: undefined reference to `init'
Natürlich. weil die funktion in keinem deiner header deklariert ist,
sprich: Der Compiler kennt die Funktion nicht, und kann sie auch nicht
finden. Das ist so, als wenn du statt init() schreiben würdest:
los_mach_was_am_besten_weltherrschaft()
Das gibt unter diesen voraussetzungen den selben fehler.
Jonas H. schrieb:> Könnte mir vorstellen,> dass ein include fehlt, aber ich weiß nicht welchen ich noch einfügen> könnte.
Am besten das, in dem init() steht... welches das ist, musst Du
wissen.
Ich habe es so verstanden, dass ich die Methode init() am Anfang
aufrufen muss, um das Board zu initialisieren, und um zu verhindern,
dass man das Board nicht mehr über einen Port ansprechen kann.
Die Arduino Header Datei habe ich nicht selbst geschrieben, und weiß
demnach auch nicht wo sich die Implementierung der init-Methode
versteckt. Möglicherweise in einer dll. Datei? ...Aber an dem Wissen
scheitere ich gerade. Ich habe gedacht es würde ausreichen, Arduino
1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.
Ein 'undefined reference' ist keine Fehlermeldung vom Compiler, sondern
vom Linker.
Dir fehlt also nicht irgendein include, sondern die Bibliothek, in der
die init Funktion tatsächlich implementiert ist. Im Header File steht ja
mehr oder weniger lediglich "Es gibt eine init Funktion". Beim Linken
kommt dann aber die Stunde der Wahrheit: Wo ist diese Funktion
tatsächlich?
Wird sie in dem zu linkenden nicht gefunden, dann gibt es eben eine
'undefined reference'.
Also: rausfinden, was du zu deinem Arudino-Nachbau sonst noch so alles
dazu linken musst.
> Möglicherweise in einer dll. Datei?
Nein. DLL sind eine Windows Spezialität. Die Libraries, die dich
interessieren haben die Dateiendung *.a
Also Verzeichnisbaum mal durchsuchen, wo sich derartige Dateien
befinden.
Danke dir auf jeden Fall schon mal für deine Antwort.
Hast du denn eine grobe Vorstellung was ich dazu linken müsste? Ob es
eine schon bestehende Datei im Arduino Verzeichnis ist? Welche Endung
sie haben müsste oder wo ich wie das Linken bewerkstelligen müsste?
Jonas H. schrieb:> Ich habe gedacht es würde ausreichen, Arduino> 1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.
Wenn du sowieso die Arduino IDE installiert hast und auch mit der
arbeitest, dann brauchst du dich doch um das gaze Gedöns mit der main()
überhaupt nicht kümmern. Das macht doch die IDE für dich. Oder nicht?
Ja, das würde Sie tun. Jedoch sitze ich an der Aufgabe, einen
Build-Prozess automatisch starten zu lassen und kann dann die IDE nicht
händisch nutzen. Deswegen muss ich das hex File ohne IDE erstellen..
Habe eine *.a Datei gefunden die passen könnte
(libgcc.a) im Verzeichnis
\Arduino\hardware\tools\avr\lib\gcc\avr\4.3.2\avr5
...wie linke ich die nun zu meiner Klasse?
Jonas H. schrieb:> Habe eine *.a Datei gefunden die passen könnte> (libgcc.a) im Verzeichnis
Nope. Die passt ganz sicher nicht.
libgcc.a ist die Standard Library, die sowieso dazu gelinkt wird.
Ich hätte nun gedacht, dass ich die init-Methode in einer Standard
Library finden könnte. Bist du dir denn sicher, dass die automatisch
(wenn ich ohne der IDE arbeite) dazu gelinkt wird?
Wo hast du denn das main her?
Die schreibst du ja normalerweise nicht selbst.
Ich geh mal davon aus, dass du dir ja wohl in der Arduino IDE ein
Projekt zusammengestellt hast, und dann nachgesehen hast, was die IDE
damit macht. Bzw. auf den Arduino Verzeichnissen das standardmässige
main dir gesucht hast.
Und ja, ich bin mir sicher, dass init() keine C++ Standardfunktion ist
und daher aus der Arduino Umgebung dazu gelinkt werden muss.
Mehr sag ich nicht, sonst geht mir die Galle hoch.
Nein mit der IDE habe ich gar nicht gearbeitet. Ich versuche lediglich
aus einer c.Datei ein Hex File zu erzeugen, welches ich nachher aufs
Board laden möchte.
Jede c.Datei braucht eine main und diese muss die setup und loop
function aufrufen. Die Infos habe ich lediglich diesem Link entnommen:
http://playground.arduino.cc/Code/Netbeans
Jonas H. schrieb:> Die Infos habe ich lediglich diesem Link entnommen:> http://playground.arduino.cc/Code/Netbeans
Dann folge der Anleitung ganz.
Ich vermute der Fehler liegt bei Schritt
"Compiling the Arduino core lib"
oder danach bei "Add library: Add libarduino_corelib.a file "
Denn da sollte die init()-Methode drinnen sein.
Karl Heinz schrieb:> Ein 'undefined reference' ist keine Fehlermeldung vom Compiler, sondern> vom Linker.
Ok, mein fehler :)
Jonas H. schrieb:> Ich habe gedacht es würde ausreichen, Arduino> 1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.
Da ist das Problem. Wenn du mal auf die arduino-seite gehst, unter
Downloads, und die seite liest, dann dürfter dier folgendes auffallen:
siehe Bild
So, finde dein Fehler und behebe ihn :)
chris_ schrieb:> #include "arduino.h">> oder>> #include "Arduino.h">> fehlt wahrscheinlich.Jonas H. schrieb:> test.c:> #include <stdio.h>> #include "Arduino.h"
Ich sag, ein Problem wird wohl sein, das die 1.0.6 keinen Support für
den Yun inbegriffen hat. den gibt es erst seit der 1.5.6-beta. Das der
Support nicht vorhanden ist, merkt man schon daran, das man das Board
gar nicht in der IDE auswählen kann. Das erklärt auch, warum
Jonas H. schrieb:> Jedoch wenn ich das hex File auf das Board lade,> kann man das Board über die Ports nicht mehr ansprechen =(.
das passiert. Der Code wird nicht für den Yun Compiliert und das
Flashprogramm geht auch von irgendeinem anderen Controller aus.
Jonas H. schrieb:> Ich habe gedacht es würde ausreichen, Arduino> 1.0.6 zu installieren
Da fängt das Problem an: Falsche version der IDE!