Forum: Compiler & IDEs Eclipse GNU ARM error undefined reference


von martin (Gast)


Lesenswert?

Hallo

ich habe mir Eclipse mit dem GNU ARM Eclipse Plug-in für den Beaglebone 
nach dieser Anleitung http://www.youtube.com/watch?v=I667-sAzzZg 
eingerichtet.

http://sourceforge.net/projects/gnuarmeclipse/files/Eclipse/updates/

Was funktioniert:
- ich kann meine main.c kompilieren und erfolgreich auf dem Board 
ausführen.
- erzeugen einer weitere Klasse und Verwendung dieser in der main geht 
auch

Was geht nicht:
Möchte ich jedoch nur eine einfach Standard C ".c" und ".h" Datei 
einbinden bekomme ich beim kompilieren den Fehler "undefined reference 
to..."

'Building target: test.elf'
'Invoking: ARM Windows GCC C++ Linker (Sourcery Lite Linux)'
arm-none-linux-gnueabi-g++ -s -Wl,-Map,"test.map" -mcpu=cortex-a8 
-mthumb -mfloat-abi=soft -g3 -o "test.elf"  ./src/src/beaglebone.o 
./src/src/beagledelay.o ./src/src/beaglegpio.o ./src/src/beaglegpiomem.o 
./src/src/beaglepins.o ./src/src/beaglepwm.o ./src/src/beagleuart.o 
./src/src/pair.o  ./src/lib/functions.o ./src/lib/gpio_c.o 
./src/lib/led_c.o  ./src/main.o

./src/main.o: In function `main':
D:\sync\workspace\test\Debug 2/../src/main.cpp:35: undefined reference 
to `gpio_export(unsigned int)'


Was muss ich ändern, damit der Compiler alle Infos bekommt, damit dieses 
Problem nicht auftritt.

von Oliver (Gast)


Lesenswert?

martin schrieb:
> Möchte ich jedoch nur eine einfach Standard C ".c" und ".h" Datei
> einbinden

Möchten reicht nicht, du musst es auch tun...

Also die Frage: Wie hast du die eingebunden?

Oliver

von martin (Gast)


Lesenswert?

was brauchst du für infos, ich hab bisher noch nie mit eclipse sondern 
nur mit avr studio gearbeitet.

Die c und h datei sind normal im projekt eingebunden.

von Stefan E. (sternst)


Lesenswert?

martin schrieb:
> Was muss ich ändern, damit der Compiler alle Infos bekommt, damit dieses
> Problem nicht auftritt.

Du musst dich über die Bedeutung von
1
extern "C"
informieren.

von Micha (Gast)


Lesenswert?

Hast du die include-Pfade eingestellt?

von Karl H. (kbuchegg)


Lesenswert?

So recht werd ich aus deiner Beschreibung nicht schlau.

Was muss man sich unter einer weiteren .c bzw. .h Datei vorstellen.

Du linkst hier
1
arm-none-linux-gnueabi-g++ -s -Wl,-Map,"test.map" -mcpu=cortex-a8 -mthumb -mfloat-abi=soft -g3 -o "test.elf" ./src/src/beaglebone.o ./src/src/beagledelay.o ./src/src/beaglegpio.o ./src/src/beaglegpiomem.o ./src/src/beaglepins.o ./src/src/beaglepwm.o ./src/src/beagleuart.o ./src/src/pair.o ./src/lib/functions.o ./src/lib/gpio_c.o ./src/lib/led_c.o ./src/main.o

Die folgenden Dateien
1
./src/main.o
2
./src/lib/led_c.o
3
./src/lib/gpio_c.o
4
./src/lib/functions.o
5
./src/src/pair.o
6
./src/src/beagleuart.o
7
./src/src/beaglepwm.o
8
./src/src/beaglepins.o
9
./src/src/beaglegpiomem.o
10
./src/src/beaglegpio.o
11
./src/src/beagledelay.o
12
./src/src/beaglebone.o
alles O-Dateien, die sind also dadurch entstanden dass die von einem 
C-Compiler aus einer .c Datei generiert wurden.

Was mir jetzt komisch vorkommt. Anhand der Dateinamen würde ich mal 
vermuten, dass alle diese O-Dateien mit Ausnahem der ersten, vom ARM-GCC 
System zur Verfügung gestellt werden. Dazu passt zwar nicht die 
Pfadangabe bei den jeweiligen Dateien, aber egal.
Von einer zweiten, von dir geschriebenen Code-Datei (die ein eigens 
O-File haben müsste) kann ich da nichts entdecken.

Welche dieser Dateien gehören jetzt wirklich zu deinem Projekt und 
welche sind System-Dateien?

denn in irgendeiner dieser Dateien müsste es eine Funktoin namens 
'gpio_export' geben. Die Fehlermeldung 'undefined reference' besagt 
jetzt nichts anderes, dass es sie aber nicht gibt. gpio_export gehört 
aber zu den Systemfunktionen, die eigentlich vorhanden sein müssten, 
wenn tatsächlich alle zum System gehörenden Object-Code Files aufgeführt 
sind. Schon alleine das kommt mir ein wenig seltsam vor, dass die hier 
scheinbar alle aufgeführt werden, denn normalerweise steckt man die in 
eine Library und linkt die Library. Aber da weiß ich zuwenig davon, wie 
das ARM Gcc System aufgebaut ist.

von M, nicht Q (Gast)


Lesenswert?

Die Linker-Reihenfolge stimmt vermutlich nicht (und nein, der Linker 
arbeitet nicht mit #include-Pfaden).

Verdächtig ist, dass main.o zuletzt in der Linker-Liste steht. Dass 
müsste zuerst (oder für den seltenen Fall das man eigenen Startup-Code 
hat ganz weit vorne) stehen.

Vermutlich ist die gesamte Reihenfolge der .o Dateien verkehrt.

von Stefan E. (sternst)


Lesenswert?

M, nicht Q schrieb:
> Vermutlich ist die gesamte Reihenfolge der .o Dateien verkehrt.

Die Reihenfolge der .o Dateien spielt überhaupt keine Rolle. Die ist nur 
bei hinzugelinkten Bibliotheken wichtig.

von Oliver (Gast)


Lesenswert?

Oliver schrieb:
> Also die Frage: Wie hast du die eingebunden?

Mach einfach einen Screenshot von Eclipse mit offenem Projektbaum.

Was verstehst du unter "Klassen"? Das gibt es eiggentlich nur in C++, du 
aber kompilierst C-Files (und nein, das ist nicht das selbe)

Zeig doch mal den Compiler-output, nicht nur den des linkers.

Fragen über Fragen...

Oliver

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.