PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler beim Kompilieren



jvbsl
13.07.2008, 12:20
Hallo,

ich hab folgendes Problem beim Kompilieren mit WinAvr:
im Forum habe ich schon gesucht aber irwie keine richtige lösung gefunden...den Code den ich Kompiliere, der ist das LED beispielprogramm, aus den Examples.
Edit: ich habe es auch mit der make_all.bat batch-datei probiert...
Ich habe programmierkentnisse in VB .Net VBA etwas Java und noch etwas C++.
> "make.exe" all

Linking: .dep/RP6Base_LEDs.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_LEDs.o -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_LEDs.elf.d RP6Base_LEDs.o ../../RP6Lib/RP6base/RP6RobotBaseLib.o ../../RP6Lib/RP6common/RP6uart.o --output .dep/RP6Base_LEDs.elf -Wl,-Map=RP6Base_LEDs.map,--cref -lm
RP6Base_LEDs.o: In function `main':
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:64: undefined reference to `setLEDs'
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:77: undefined reference to `setLEDs'
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:94: undefined reference to `setLEDs'
make.exe: *** [.dep/RP6Base_LEDs.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:00
und wenn es an der avrc lib liegt, dann schickt mir bitte einen link, wo ich diese finden kann.

Danke für eure Hilfe Gruß jvbsl

fhs
13.07.2008, 12:44
Hallo,


RP6Base_LEDs.o: In function `main':
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:64: undefined reference to `setLEDs'
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:77: undefined reference to `setLEDs'
c:\programme\rp6\examples\rp6base_examples\example _01_leds/RP6Base_LEDs.c:94: undefined reference to `setLEDs'


Du hast irgendwo in Deiner "main" einen Aufruf der Art <pre>setLEDs()</pre>, der vom Linker nicht aufgelöst werden kann. Wo ist Deine Funktion <pre>setLEDs()</pre> definiert/deklariert?

Gruß

Fred

jvbsl
13.07.2008, 12:51
Hallo,

hier mein Code setLEDs() rufe ich in der Main Methode auf:


#include "RP6RobotBaseLib.h"

int16_t main(void)
{
initRobotBase();

writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");

writeString_P("Hello World! My name is Robby!\n");
writeString_P("Let's go! :)\n");

setLEDs(0b111111);
mSleep(1000);
setLEDs(0b000000);
mSleep(500);

uint8_t runningLight = 1;

while(true)
{
setLEDs(runningLight);
runningLight <<= 1;
if(runningLight > 32)
runningLight = 1;
mSleep(100);
}
return 0;
}


Gruß jvbsl

fhs
13.07.2008, 13:03
Hallo,

ich kenne Deine Software nicht, kann Dir aber wahrscheinlich helfen, wenn Du hier eine (z.B. ZIP-) Datei mit allen Komponenten (einschl. RP6RobotBaseLib.h) anhängst. Wie gesagt, der Compiler scheint nicht zu wissen, worum es sich bei <pre>setLEDs()</pre> handelt! Wo ist diese Funktion deklariert/definiert?

Gruß

Fred

jvbsl
13.07.2008, 13:28
Hallo,

ich benutze den Programmer's Notepad v2.0.7.667 also WinAvr oder so.
der Anhang enthält alle Examples von der CD...und auf meinem alten PC hat das Kompilieren ja ohne probleme funktioniert.

https://www.roboternetz.de/phpBB2/files/examples.rar

Gruß jvbsl

fhs
13.07.2008, 14:49
Hi,

es genügt nicht, dass Du <pre>#include "RP6RobotBaseLib.h"</pre> verwendest. Du musst auch "RP6RobotBaseLib.c" mit angegeben habe (ich verwende AVRStudio, da würde man diese Datei unter "Source Files" angeben). Wie das bei Deiner Entwicklungsumgebung funktioniert, weiß ich nicht. Das Problem ist jedenfalls, dass der Linker die Funktion nicht kennt.

Gruß

Fred

Martin.
13.07.2008, 15:07
Hast du schonmal bei deiner makefile die RP&RobotBaseLib.c eingetragen? wenn du das mfile Program von WinAVR verwendest, kannst du die Datei bei "C++ source files" anhängen. Bei den Beispielen sind ja Makefiles dabei wo die RP6RobotBaseLib bei "source" dabeisteht.

jvbsl
13.07.2008, 18:03
Hallo,

nein das hab ich leider noch nicht ausprobiert, könntest du mir vielleicht erklären wie man soetwas bewerkstelligen kann?

Danke jvbsl

Martin.
13.07.2008, 18:10
In deinem Programmordner muss es eine Datei mit dem namen makefile geben.

ich hab jetzt nur mal den Anfang der makefile reingestellt:



# Hey Emacs, this is a -*- makefile -*-
################################################## #############################
# RP6 MAKEFILE FOR WinAVR
# Based on WinAVR Sample makefile written by Eric B. Weddington,
# Jörg Wunsch, et al.
#
#
# YOU NEED TO EDIT SOME SMALL THINGS IN THIS FILE IF YOU WANT TO USE
# IT FOR YOUR OWN PROJECTS!
# THESE LINES ARE ALL AT THE TOP OF THIS FILE AND MARKED VERY CLEARLY !
# BETTER DO NOT EDIT ANYTHING ELSE!
#
# To compile everything you can simply type "make all" on a command line in
# this directory or simply use the supplied batch files!
# To remove all the temporary files the compiler has generated you can use
# "make clean"
# See end of this file and "make" user manual for more details!
#
#
# Note: Everything behind a '#' is interpreted as a comment in this file!
#
################################################## #############################




################################################## #############################
# Target file name (without extension).
# This is the name of your main C source file! Do NOT append the ".c"!
# Example: Let's assume your main source file is "RP6Base_MyProgram.c", then
# you would write: TARGET = RP6Base_MyProgram

TARGET = RP6Base_LEDs

################################################## #############################



################################################## #############################
# Specify relative path to RP6 library files here.
# This is "../../RP6Lib" or "../RP6Lib" usually.

RP6_LIB_PATH=../../RP6Lib
RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common

################################################## #############################


#------------------------------------------------
# Main Source file is _automatically_ added here:
SRC = $(TARGET).c
# DO NOT EDIT THIS!


################################################## #############################
# If there is more than one source file, append them here separated by spaces.
# Usually you have to add the Library files here! (ONLY add c files "*.c" here,
# NO header files "*.h"!)
# Don't forget to add relative paths!

SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c


Bei den letzten beiden zeilen siehst du welche Dateien mit eingebunden werden. So muss es bei dir auch ausschauen.

fhs
13.07.2008, 18:12
Hi,

laut Dokumentation muss

<pre>SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c</pre>

in den makefile (Syntax/Pfad muss an Deine Verhältnisse angepasst werden!).

Gruß

Fred


PS: OOps, Martin war schneller!

jvbsl
13.07.2008, 18:24
tut mir leid, es hat mir leider nicht weitergeholfen, die beiden letzten zeilen stehen genau so drinne wie du es geschrieben hast und es geht natürlich auch noch weiter...früher auf meiner alten festplatte hatte doch alles so problemlos funktioniert... :(

Martin.
13.07.2008, 18:26
Stimmen dann die Pfade (also der zu der RP6RoboBaseLib.c Datei) sicherlich überein?

jvbsl
13.07.2008, 18:32
Hallo,
also wenn ich dich richtig verstanden habe, meinst du folgende:



RP6_LIB_PATH=../../RP6Lib
RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common

Mein problem hierbei währe, dass ich nicht ganz verstehe, was kommt bei ../../RP6Lib denn für ein Pfad raus, in VB ist das halt alles anders

Gruß jvsbl

Martin.
13.07.2008, 18:37
../ bedeutet einen ordner nach oben.

Also du öffnest mit deinem Arbeitsplatz den Ordner wo deine Makefile und deine main.c oder so drinnen liegt. Dann wechselst du zweimal in der Ordnerhierarchie nach oben. Also zum Beispiel von C:\Ordner1\Ordner2\Ordner3 kommst du erst zu C:\Ordner1\Ordner2 und dann zu C:\Ordner1. Dort muss dann der Ordner RP6Lib sein. Den öffnest du und überprüfst od da deine Datei liegt!

jvbsl
13.07.2008, 18:46
also erstmal danke für die tatkräftige hilfe,
jetzt kommt zumindest mal eine andere Fehlermeldung^^
...aber warum geht dass dann immer noch nicht
jetzt sieht der fehler so aus


> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20080610) 4.3.0
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `RP6Base_LEDs.elf', needed by `elf'. Stop.

> Process Exit Code: 2
> Time Taken: 00:01


jvbsl

SlyD
14.07.2008, 08:29
Hallo,

bevor Ihr hier alle weiter diskutiert - Du nutzt eine neue WinAVR Version - nämlich 20080610, aber leider noch die ganz alten Beispielprogramme von der CD. Lad Dir doch zuerst mal bitte die neuen Beispielprogramme herunter, WinAVR ändert sich mit jedem neuen Release und da muss man ab und an mal die Makefiles anpassen.

--> http://www.arexx.com/rp6

MfG,
SlyD

jvbsl
14.07.2008, 16:08
Hallo,

vielen Dank, ich war schon fas am verzweifeln endlich kann ich weiter proggen.

Gruß jvbsl