PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] eclipse- Fehler beim Linken



Renatraps
10.06.2014, 16:37
Hallo,
ich möchte mit eclipse in C den ASi-Master von Bihl + Wiedemann programmieren.
Das Programm funktioniert auch solange ich meine Routinen in der main.c betreibe.
Nun möchte ich die Routinen in eine Unterfunktion "Grundstellung.c" auslagern um die Programmübersicht zu vereinfachen und öfters auf diese Routinen zugreifen zu können.
Habe nun ein neues Source file bzw. Header file erzeugt und meinen Code dorthin übertragen. Ich habe die Funktion als "Grundstellung_anfahren ();" deklariert.
Beim Linken bekomme ich folgenden Fehler:



**** Attempting to build... ****

C:\Program Files\eclipse_control\Compiler\msys\1.0\bin\sh -c export PATH=../../Compiler/msys/1.0/bin:$PATH ;make -sf pbus.mak DEBUG=0 all
-----------------------
control -- Release
-----------------------

.release/main.o: In function `main':
C:\Program Files\eclipse_control\Workspace\Profibus/main.c:104: undefined reference to `Grundstellung_anfahren'
collect2: ld returned 1 exit status
make: *** [.release/control.elf] Error 1



Wenn ich das Selbe Programm in eine bereits existierende Unterfunktion einfüge, bei der ich zuvor alles lösche, funktioniert das Programm. Es muss dazugesagt werden, dass es vom Hersteller bereits ein Stück Code gab, welches ein Unterprogramm beinhaltet. In dieses habe ich es eingefügt aber wie gesagt zuvor den Inhalt gelöscht.

Kann mir jemand den entscheidenden Tip geben? Evtl. ist dieses Problem bereits jemandem geläufig.
Ich vermute dass es an irgendwelchen Grundeinstellungen liegt. Allerdings sind mir beim Vergleichen der Einstellungen der beiden Unterfunktionen keine Unregelmäßigkeiten aufgefallen.

Gruß Rena

markusj
10.06.2014, 16:48
Du rufst eine Funktion auf die der Compiler/Linker nicht kennt, daher die Fehlermeldung. Welche Funktion das ist verrät er dir auch.

mfG
Markus

Renatraps
11.06.2014, 07:27
Hallo Markus,
soweit ist mir das bekannt aber dennoch nicht nachvollziehbar.
Wer genau liest stellt fest, dass dieser Fehler nur dann auftritt wenn ich die Funktion mit einer neu erstellten Unterfunktion aufrufe.
Wenn ich dann exakt den selben Code in einer bereits bestehenden Unterfunktion aufrufe (deren Inhalt habe ich vorher gelöscht, es wird dort also nichts zusätzliches deklariert) funktioniert es allerdings.
Gruß Rena

Klebwax
11.06.2014, 08:34
Wer genau liest stellt fest,
Ich finde keinen übersetzbaren Code, mit dem man das Problem nachvollziehen kann.

dass dieser Fehler nur dann auftritt wenn ich die Funktion mit einer neu erstellten Unterfunktion aufrufe.
Wenn ich dann exakt den selben Code in einer bereits bestehenden Unterfunktion aufrufe (deren Inhalt habe ich vorher gelöscht, es wird dort also nichts zusätzliches deklariert) funktioniert es allerdings.

Was ist der Unterschied zwischen Funktion und Unterfunktion? In C sind Funktionen grundsätzlich global und werden auch global deklariert.

MfG Klebwax

Renatraps
11.06.2014, 08:59
Hallo Klebwax,

es gibt eine Hauptfunktion "main.c", diese soll eine Unterfunktionen "Grundstellung.c" aufrufen.

Den Code hatte ich in der main.c gesschrieben und alles war prima.
Dann habe ich die Grundstellung.c erstellt und den Code dort hin kopiert. Dies funktioniert nicht.
Dann Code in eine bestehende "control_io.c" kopiert und vorher deren ursprünglichen Code entfernt. Dies funktioniert dann.
Es hat sich also an meiner "Unterfunktion" (diese nenne ich nun mal so) nichts inhaltlich geändert. Sie liegt nur wo anders ab.

Eventuell jetzt eine Idee?

Gruß Rena

Gruß Rena

Sisor
11.06.2014, 09:40
Hallo Rena,

hast du dem Kompiler angegeben, dass die Datei Grundstellung.c einzubinden ist?
Hier (http://www.c-howto.de/tutorial-praeprozessor-dateien-einbinden.html)mehr dazu...

MFG Sisor

markusj
11.06.2014, 11:05
es gibt eine Hauptfunktion "main.c", diese soll eine Unterfunktionen "Grundstellung.c" aufrufen.
Du wirfst Quelltextdateien mit Funktionen durcheinander. Grundeinstellung.c ist eine andere Datei mit Quelltext, wenn der Compiler die nicht kennt, gilt das auch für deren Inhalt!

Verwendest du ein Makefile oder kümmert sich Eclipse um den den Build-Vorgang? Weil: Eclipse kümmert sich normalerweise selbst darum, dass alle Quelltextdateien vom Compiler übersetzt werden. Wenn du mit einem Makefile arbeitest, musst du dieses dagegen selbst entsprechend anpassen!

Davon abgesehen: Du machst die aufgerufenen Funktionen hoffentlich auch in einem Header (Grundstellung.h) bekannt, den du in main.c einbindest?

mfG
Markus

PS: Evtl. solltest du dir einige C-Tutorials ansehen bevor du wild mit verschiedenen Quelltextdateien um dich wirfst. Modularisierung erfordert schon etwas Grundlagenverständnis.