PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linker meldet: /main.c:10: undefined reference to `test_init



Jeronnimo
12.11.2007, 21:41
Hallo liebe C Gemeinde,

ich habe ein Problem beim Linken meines Programmes mit extern deklarierten Funktionen. (siehe attachement)

Meldung:
Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm
main.o: In function `main':
main.c:10: undefined reference to `test_init'
make.exe: *** [main.elf] Error 1

wo liegt der Hund begraben...?

Danke, Jeronnimo

izaseba
12.11.2007, 21:50
Übersetzt Du denn auch die test.c ?

Wie sieht denn Makefile aus ?

Jeronnimo
12.11.2007, 22:03
Hier das makefile:

izaseba
12.11.2007, 22:11
Hab mir schon gedacht...
füg mal nach


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c




SRC += test.c


ein, dann klappt es auch .

Gruß Sebastian

Jeronnimo
12.11.2007, 22:32
Hallo Sebastian,

jetzt meldet der Linker:

Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.o -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d test.o --output main.elf -Wl,-Map=main.map,--cref -lm
c:/programme/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr4/crtm8.o: In function `__vectors':
../../../../../avr-libc-1.4.6/crt1/gcrt1.S:51: undefined reference to `main'
make.exe: *** [main.elf] Error 1

Danke für Deinen Input!

Gruß Je

izaseba
12.11.2007, 22:50
O weh,
ich habe mir mal Deine test.h angeschaut, warum wird die test_init() als extern deklariert ?

Ich schaue eben moment

izaseba
12.11.2007, 23:00
So nachdem ich global.h entfernt habe wird dieses 'Projekt' kompilert,
bis auf eine Warnung daß Du kein Newline am Ende von main.c hast.

Entweder postest Du das ganze Programm, oder kann ich Dir nicht helfen, sorry.

Gruß Sebastian

Jeronnimo
14.11.2007, 16:32
@Sebastian:

Hab deas "Problem" dank Deiner Hilfe gelöst. Ich hatte Dich so verstanden die zwei Zeilen im Makefile gegeneinander auszutauschen, daher die erneute Fehlermeldung (mein Fehler). Mit beiden Zeilen hintereinander tut der Linker anstandslos seinen Dienst.

SRC = $(TARGET).c
SRC += test.c

Besten Dank, Jeronnimo

021aet04
24.11.2009, 19:29
Der Thread ist zwar schon älter, wollte aber keinen neuen Thread aufmachen.
Habe ein ähnliches Problem, aber bei mir fehlt der Eintrag "# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c "
Ich habe nicht den Mega8 sondern den Mega32. Die Makefile hänge ich einmal an.

Ich verwende die AVRlib (nicht avrlibc). Es war eine makefile bei einem Beispiel dabei (hochgeladen als makefile_2), hat aber nichts genutzt. Ich habe Versuchsweiße in die Original Makefile den Ausschnitt


########### you should not need to change the following line #############
include $(AVRLIB)/make/avrproj_make

###### dependecies, add any dependencies you need here ###################
# Dependencies tell the compiler which files in your code depend on which
# other files. When you change a piece of code, the dependencies allow
# the compiler to intelligently figure out which files are affected and
# need to be recompiled. You should only list the dependencies of *.o
# files. For example: uart.o is the compiled output of uart.c and uart.h
# and therefore, uart.o "depends" on uart.c and uart.h. But the code in
# uart.c also uses information from global.h, so that file should be listed
# in the dependecies too. That way, if you alter global.h, uart.o will be
# recompiled to take into account the changes.

buffer.o : buffer.c buffer.h
uart.o : uart.c uart.h global.h
uart2.o : uart2.c uart2.h global.h
rprintf.o : rprintf.c rprintf.h
a2d.o : a2d.c a2d.h
timer.o : timer.c timer.h global.h
pulse.o : pulse.c pulse.h timer.h global.h
lcd.o : lcd.c lcd.h global.h
i2c.o : i2c.c i2c.h global.h
spi.o : spi.c spi.h global.h
swpwm.o : swpwm.c swpwm.h global.h
servo.o : servo.c servo.h global.h
swuart.o : swuart.c swuart.h global.h
tsip.o : tsip.c tsip.h global.h
nmea.o : nmea.c nmea.h global.h
vt100.o : vt100.c vt100.h global.h
gps.o : gps.c gps.h global.h
$(TRG).o : $(TRG).c global.h


eingefügt, ohne Erfolg.

In der C-Datei steht

#include <a2d.h>
int main(void)
{
a2dInit();
a2dSetReference(ADC_REFERENCE_AREF);
.....
}


In der Headerdatei steht

#define ADC_REFERENCE_AREF 0x00 ///< 0x00 -> AREF pin, internal VREF turned off
void a2dInit(void);
void a2dSetReference(unsigned char ref);


Eine a2d.c ist auch dabei, die ich mit der makefile-Datei mit einbinden wollte, ohne Erfolg.
Hat einer einen Vorschlag, was ich noch versuchen könnte?

MfG Hannes

021aet04
25.11.2009, 18:18
Hat keiner eine Idee? Die Beispiele funktionieren auch nicht, es sind allerdings keine APS (Projekt) Dateien dabei sondern nur Makefile, C Dateien und einige weitere Dateien.

MfG Hannes

uwegw
25.11.2009, 22:54
In deinem makefile gibts nen Abschnitt
#put your C sourcefiles here
# Here you must list any C source files which are used by your target file.
# They will be compiled in the order you list them, so it's probably best
# to list $(TRG).c, your top-level target file, last.

Da musst du deine c-Dateien eintragen.
Entweder zu den anderen Dateien in dieselbe Zeile, oder (wie im avr-libc-makefile) mit SRC+=... (wirkt wie in C: zu SRC wird etwas hinzugefügt (=addiert).


Und was genau ist jetzt dein Problem, und mit welcher Software versuchst du das zu kompilieren? winavr? Aus dem avr studio heraus?

021aet04
26.11.2009, 17:33
Habe jetzt die Makefile_2 genommen. Die Datei, die ich eingebunden habe ist gleich bis auf diesen Bereich

#put the name of the target file here (without extension)
# Your "target" file is your C source file that is at the top level of your code.
# In other words, this is the file which contains your main() function.

TRG = a2dtest

Geändert habe ich es auf TRG = pwmtest, da meine datei pwmtest.c heißt.

Fehler bekomme ich diese
D:\Dokumente und Einstellungen\admin\Eigene Dateien\Atmel\AtMega32\test\default/../../../Vorlage/PWM_ADC/pwmtest.c:19: undefined reference to `a2dInit'
D:\Dokumente und Einstellungen\admin\Eigene Dateien\Atmel\AtMega32\test\default/../../../Vorlage/PWM_ADC/pwmtest.c:20: undefined reference to `a2dSetReference'

PS: Ich arbeite mit AVR Studio (neueste Version, da ich dachte, dass der Fehler daher kommt) und dem AVR GCC Compiler

MfG Hannes

uwegw
26.11.2009, 19:21
Wenn du mit dem AVR Studio arbeitest, musst du das makefile nicht unbedingt von Hand ändern, du kannst es auch automatisch erzeugen lassen. Leg ein neues Projekt an, füge dort alle Dateien hinzu, und dann in den Projekteinstellungen evtl noch die Pfade zu der Lib setzen...


PS, hast du eigentlich, wie in der avrlib/make/readme.txt beschrieben, die beiden Umgebungsvariablen gesetzt?

021aet04
26.11.2009, 20:05
Das dürfte der Fehler sein, wie mache ich das. In was für einer Datei bzw Einstellung muss ich das schreiben oder muss ich die avrproj_make Datei irgendwo hin kopieren habe zwar auf der Homepage (http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html) die Anleitung, aus der werde ich aber nicht schlau.

MfG Hannes

uwegw
26.11.2009, 20:32
Rechtsklick auf Arbeitsplatz -> Erweitert -> Umgebungsvariablen.
Dort kannst du die Variablen dann entweder nur für dein Benutzerkonto oder für alle anlegen.

021aet04
28.11.2009, 09:48
Danke für die Antwort, das war es zwar nicht alleine, aber jetzt habe ich es geschaft. Wenn ich im AVR Studio auf "Build Active Configuration" oder "Build and Run" klicke kommen Fehler "..... dundefined reference to ...., aber wenn ich im CMD-Prompt es so mache wie auf der Procyon HP unter "Testing" funktioniert es und es wird eine Hex erstellt. Was könnte da schuld sein, oder funktioniert es mit AVR Studio nicht? Im AVR Studio im Ordner "External Dependencies" sind die Headerdateien vorhanden.

PS: Ich werde einen Artikel über die Installation und Anwendung von der AVRlib Sammlung schreiben.

Edit: Mein erstes Programm mit der AVRLIB habe ich gerade hochgeladen und funktioniert (bis auf eine kleinen Fehler). Ist zwar nur ein kleines Testprogramm, aber es funktioniert.

MfG Hannes

021aet04
08.12.2009, 18:38
Habe gerade im Wissensbereich eine "Installationsanleitung von AVRlib" in der Kategorie "Quellcode C" erstellt