Forum: Compiler & IDEs Ein leztes Mal: "No rule . . ."


von Philipp K. (trace-bug)


Angehängte Dateien:

Lesenswert?

Hoi,

ic habe, wi viele andere, das habe ich im Forum gesehen, das Problem,
das dass AVR-Studio nur die eine Meldung für nich hat:

make: *** No rule to make target `../16bittimer.c', needed by
`16bittimer.o'.  Stop.

Im Programmers Notpad sowie in der CMD erhalte ich bei ausführen von
make dieselbe Ausgabe. Ich habe früher in Assembler programmiert und
versuche mich jetzt an C. Der Code soll einfach nur eeine LED blinken
lassen. So zum Test. Der Sourcecode: Im Anhang



Mit dem Makefile vom Studio (neueste Version) gibts kein target. Mit
einem selbst erstellten, aus dem sample Verzeichniss von winavr findet
er die Includes nicht.

Das makefile vom Studio (no rule to make...):

######################################################################## 
#######
# Makefile for the project 16bittimer
######################################################################## 
#######

## General Flags
PROJECT = 16bittimer
MCU = atmega168
TARGET = 16bittimer.elf
CC = avr-gcc

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2                -DF_CPU=4915200UL  -O0
-funsigned-char
CFLAGS += -Wp,-M,-MP,-MT,$(*F).o,-MF,dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0


## Include Directories
INCLUDES = -I"Q:\{Daten\{code\C\Sammlung_h-files"

## Objects that must be built in order to link
OBJECTS = 16bittimer.o

## Build
all: $(TARGET) 16bittimer.hex 16bittimer.eep 16bittimer.lss size

## Compile
16bittimer.o: ../16bittimer.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
   $(CC) $(LDFLAGS) $(OBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
  avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
  avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

size: ${TARGET}
  @echo
  @sh avr-mem.sh ${TARGET} ${MCU}

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) 16bittimer.elf dep/ 16bittimer.hex 16bittimer.eep
16bittimer.lss

## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)





Wie zu sehen ist wird der 16bit timer benutzt. Über den
Laufwerksbuchstaben Q nicht wundern. Ich benutzte für meine Daten eine
externe Festplatte. Dort gibt es auh den Ordner Sammlung_h-files. Dort
befinden sich die h-files von winavr (neueste Version) und einigen
anderen Compilern. Also liegen die h-files nicht im Verzeichnis mit dem
Sourcecode. Dürfte aber kein Problem sein.

Ich weiß das es ein oft beschriebenes Problem in den Foren ist. Aber
ich habe noch keinen Beitrag gelesen der mir geholfen hat. Ich hoffe
ihr könnt mir helfen. Verzweifele langsam.

Danke schonmal

von Feadi (Gast)


Lesenswert?

Ich kenn mich mit Makefiles ein bischen aus, vielleicht kann ich helfen,
aber ich muss wissen wie der Verzeichnissbaum aussieht und welche
Dateien drinn sind.
Wichtig ist der Inhalt des Projektverzeichnisses, und der des
übergeordneten Verzeichnisses(..)

Feadi

von Philipp K. (trace-bug)


Lesenswert?

Mahlzeit,

ich werde Dich jetzt mal mit Daten "füttern" ;-) obwohl ich nicht
ganz weiß ob es die richtigen sind.

Also, alle Daten befinden sich auf der externen. Unter Q.

Der Pfad zum Projekt ist:
Q:\{Daten\{code\C\Projekte\2006\16bittimer

Wobei 16bittimer eben der Projektordner ist. Darin enthalten sind:

16bittimer.aps
16bittimer.c
makefile

sowie die Ordner

.dep und dep. Ersterer enthält eine Datei 16bittimer.o.d und letzterer
ist leer.

Die übergeordnete Ordnerhirarchie enthält nur Ordner. Das /2006, also
der übergeordnete Ordner, enthält sonst keine weiteren Ordner und
Dateien. [Ich habe es noch nicht gemacht, aber sollte ich vielleicht
die benutzten h-files in den Projektordner bzw. in den übergeordnten
Orner packen?]

Der Ordner (aufwärts vom Projektordner) /Projekte enthält einen
weiteren Ordner mit einem niht laufenden Projekt, das allerdings nicht
weiter wichtig ist.

Der nächste Ordner (/C) enthält das Ordner die entweder Tutorials oder
Übungen enthalten. Diese Übungen sind allerdings eher "normales C"
die Funtionieren auch alle. Gemacht wurden diese mit der lss-win32.
Ebenso den Ordner Sammlung_h-files. Der enthält die Unterordner IAR und
winavr.

Benutzt werden die files von winavr.

Ich das ist was Du wissen musst. Danke schonmal.

von Tom (Gast)


Lesenswert?

Hallo
Ich vermute, dass die Datei 16bittimer.c nicht gefunden wird. Du
schreibst ja, dass das Makefile im selben Verzeichnis liegt wie
16bittimer.c. Also versuch einfach mal das ../ wegzulassen.

Tom

von Philipp K. (trace-bug)


Lesenswert?

Danke soweit

Aus der CMD herraus funtioniert es, aber im Studio noch nicht. Das
Studio ändert das makefile vor dem Build wieder. Versuche mal die
Dateien zu kopieren und im Wurzelverzeichniss des Studios abzulegen.

von Philipp K. (trace-bug)


Lesenswert?

Habe bevor ich Kopieren wollte mal nochmal die makefile durchsucht die
von winavr zur verfügung gestellt wurde. Habe dann festgestellt das ich
einfach nur die falschen Slashes benutzt habe. \ anstatt /.

Jetzt habe ich immer noch ne Fehlermeldung, allerdings ne andere:

gcc plug-in: Error: Object file not found on expected location
Q:\{Daten\{code\C\Projekte\2006\16bittimer\16bittimer.elf
Make sure your makefile specifies the output .elf file as
16bittimer.elf
gcc plug-in: Error: Object file not found on expected location
Q:\{Daten\{code\C\Projekte\2006\16bittimer\16bittimer.elf
Make sure your makefile specifies the output .elf file as
16bittimer.elf


Ändere ich in der Makefile:

# Target file name (without extension).
TARGET = 16bittimer

in

# Target file name (without extension).
TARGET = 16bittimer.elf

kommt das bei rum:

make: *** No rule to make target `16bittimer.elf.o', needed by
`16bittimer.elf.elf'.  Stop.
Build failed with 1 errors and 0 warnings...


Ändere ich den falschen Eintrag?

von Feadi (Gast)


Lesenswert?

## Compile
16bittimer.o: ../16bittimer.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

Diese Regel sieht seltsam aus. In welchem Verzeichniss liegt denn nach
dem Build die .o Datei?



Probier doch mal das hier:

## Compile
16bittimer.o: ../16bittimer.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<
  echo PWD: $(shell PWD)  # debug
  ls -la                  # debug

##Link
$(TARGET): $(OBJECTS)
  $(CC) $(LDFLAGS) $(OBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
  echo PWD: $(shell PWD)  # debug
  ls -la                  # debug


Poste dann was dein Build alles ausgibt.

Feadi

von Philipp K. (trace-bug)


Lesenswert?

Also, danke, werde das ausprobieren.

Allerdings sollte ich noch erwähnen das die letzte gepostete
Fehlermeldung nach ausmärzen zweier Fehler im Code nur noch komm wenn
ich im Studio den build ausführe. Wenn ich die selbe makefile nehme und
in der CMD ausführe ist alles in Ordnung. Danach kann ich auch im Studio
"builden".

von Ich B. (ichbin)


Lesenswert?

hallo, vermutlich schon bekannt, falls nicht: avr-studio ist buggy, was
die slashes angeht. es gibt einen patch, der das problem möglicherweise
behebt. mal im avr-freaks forum nachsehen, da treibt sich auch der
entwickler vom avrstudio rum..

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.