Forum: Compiler & IDEs Studio 6.1 Rebuild fails


von Thomas S. (thomasschattat)


Angehängte Dateien:

Lesenswert?

Hallo,
mein Projekt hat immer schön compiliert, auf einmal funktioniert es 
nicht mehr. Die Fehlermeldung habe ich mal im Anhang, eine Lösung dazu 
finde ich nicht. Google bringt mir da nix was passt.

Nun dachte ich: Na gut, das Projekt ist verbockt, mach ich ein neues. 
Wenn ich das leere compiliere funktioniert es immer wieder, kopiere ich 
meinen Code aus dem alten Projekt in die C Datei passiert folgendes:

Build/Rebuild funktioniert.
Clean all funktioniert auch.
Rebuild geht wieder
Noch ein Rebuild geht nicht, make.exe clean all löscht die Dateien, 
build geht dann schief.
Wieder Rebuild ist dann wieder OK weil clean vorher OK war.

Also das Problem ist dass nach einem Build das Löschen und neu 
compilieren nicht funktioniert, es geht nur der Löschteil. Erst der 
nächste Schuss compiliert wieder.

Wieso hängt das mit meinen C-Code zusammen? Wenn Clean vorher war ist 
das kein Problem. Und das leere Projekt zeigt diesen Effekt nicht.

Ich muss also immer zweimal Rebuild machen oder erst clean und dann 
Re/Build.

Kann jemand die Fehlermeldung erklären?
Danke für eure Meinungen..
Thomas

von Stephan (Gast)


Lesenswert?

wie sieht denn das make-File aus?

von Arduinoquäler (Gast)


Lesenswert?

Thomas Schattat schrieb:
> Danke für eure Meinungen..

Einfach mal ein neueres Studio ausprobieren ....

von Stephan (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Einfach mal ein neueres Studio ausprobieren ....

hat das Studio da einen Bug?????

von Thomas S. (thomasschattat)


Angehängte Dateien:

Lesenswert?

Hallo,
hab das MAKE File mal angehängt. Das ist das neue Projekt, leer 
kompiliert es, mit meinem Code ist das Problem da.
Maks clean all geht nicht, nur clean, und wenn es clean war geht auch 
all.

Gruß
Thomas

von Markus F. (mfro)


Lesenswert?

in deinem "clean" target hast Du ein rm ohne vorherigen Bindestrich 
stehen.
1
# Other Targets
2
clean:
3
  -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)  
4
  -$(RM) $(C_DEPS_AS_ARGS)   
5
  rm -rf "DotUhr.elf" "DotUhr.a" "DotUhr.hex" "DotUhr.lss" "DotUhr.eep" "DotUhr.map" "DotUhr.srec"
Wenn eine der Dateien, die beim letzten rm gelöscht werden sollen, nicht 
da ist, kehrt das rm-Kommando mit einem Fehler zurück und make bricht 
(deswegen) ab. Der initiale Bindestrich verhindert das.

Mach' den Bindestrich auch vor die letzte Zeile und ich wette, "clean 
all" funktioniert.

von Thomas S. (thomasschattat)


Lesenswert?

Hi Markus,
bin verblüfft und habe das probiert. Funktioniert leider nicht, das 
Minuszeichen verschwindet automatisch wieder beim Compilieren.
Hab dann mal das Makefile schreibgeschützt gemacht, dann kommt ein 
Fehler dass er nicht drin herumschreiben darf.
Das wird also beim Rebuild geändert, wie kommt sowas? Und warum macht es 
ein frisches leeres Projekt nicht?

Gruß
Thomas

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Markus F. schrieb:
> in deinem "clean" target hast Du ein rm ohne vorherigen Bindestrich
> stehen.
>
>
1
> # Other Targets
2
> clean:
3
>   -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)
4
>   -$(RM) $(C_DEPS_AS_ARGS)
5
>   rm -rf "DotUhr.elf" "DotUhr.a" "DotUhr.hex" "DotUhr.lss" "DotUhr.eep" 
6
> "DotUhr.map" "DotUhr.srec"
7
>
> Wenn eine der Dateien, die beim letzten rm gelöscht werden sollen, nicht
> da ist, kehrt das rm-Kommando mit einem Fehler zurück und make bricht
> (deswegen) ab. Der initiale Bindestrich verhindert das.
>
> Mach' den Bindestrich auch vor die letzte Zeile und ich wette, "clean
> all" funktioniert.

Die Erklärung ist leider Nonsens. Der Bindestrich bedeutet jetzt kommt 
ein optionaler Parameter. -r bedeutet rekursiv, -f bedeutet force. Die 
Kurzform von beiden ist -rf. Richtig ist, dass -f dazu führt, dass eine 
fehlende Datei nicht zum Abbruch führt. Siehe "man rm".

Gruß

Olaf

von Oliver S. (oliverso)


Lesenswert?

Thomas Schattat schrieb:
> bin verblüfft

weil das Studio 6.1 zwar nicht mehr das neueste ist, aber trotzdem 
problemlos funktioniert hat.

Wie schon gesagt wurde, ein Update auf die aktuellste Version sollte 
auch das Problem lösen.

Du kannst zwar versuchen, rauszufinden, warum das jetzt nicht 
funktioniert, aber ändern kannst du daran eh nichts.

Oliver

von Thomas S. (thomasschattat)


Lesenswert?

Also ist das ein bestätigter Bug?
Ich werde mal das neueste Studio (ver)suchen und mich melden was dabei 
herauskam.

Erstmal danke an alle die sich gemeldet haben.

Gruß
Thomas

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Olaf Dreyer schrieb:
> Markus F. schrieb:
>> in deinem "clean" target hast Du ein rm ohne vorherigen Bindestrich
>> stehen.
>>
>>
1
>> # Other Targets
2
>> clean:
3
>>   -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)
4
>>   -$(RM) $(C_DEPS_AS_ARGS)
5
>>   rm -rf "DotUhr.elf" "DotUhr.a" "DotUhr.hex" "DotUhr.lss" "DotUhr.eep"
6
>> "DotUhr.map" "DotUhr.srec"
7
>>
>> Wenn eine der Dateien, die beim letzten rm gelöscht werden sollen, nicht
>> da ist, kehrt das rm-Kommando mit einem Fehler zurück und make bricht
>> (deswegen) ab. Der initiale Bindestrich verhindert das.
>>
>> Mach' den Bindestrich auch vor die letzte Zeile und ich wette, "clean
>> all" funktioniert.
>
> Die Erklärung ist leider Nonsens. Der Bindestrich bedeutet jetzt kommt
> ein optionaler Parameter. -r bedeutet rekursiv, -f bedeutet force. Die
> Kurzform von beiden ist -rf. Richtig ist, dass -f dazu führt, dass eine
> fehlende Datei nicht zum Abbruch führt. Siehe "man rm".
>
> Gruß
>
> Olaf

Bevor man etwas schreibt, sollte man sich genau lesen und sich 
informieren.
Ich bitte diesen Beitrag zu ignorieren.

Gruß

Olaf

von Markus F. (mfro)


Lesenswert?

Thomas Schattat schrieb:
> Das wird also beim Rebuild geändert, wie kommt sowas? Und warum macht es
> ein frisches leeres Projekt nicht?

dann solltest Du versuchen rauszukriegen, warum deine IDE es bei den 
oberen beiden Zeilen richtig macht und bei der letzten falsch - welche 
Unterschiede gibt's da bei der Konfiguration des Projekts?

von Thomas S. (thomasschattat)


Lesenswert?

Die Konfiguration is genau gleich. Ich mache ein neues Projekt, Rebuild 
geht immer.
Dann klebe ich meinen Code in die C Datei und das Problem ist da. Die 
Konfiguration ändere ich dabei gar nicht.
Es gibt zwei Header Dateien im selben Verzeichnis die eingebunden 
werden, sollte davon unabhängig sein.
Build geht nur wenn vorher Clean aufgerufen wurde.

von Markus F. (mfro)


Lesenswert?

So, wie's in deinem Makefile aussieht, ist die Datei, die er löschen 
will und die nicht erzeugt wird/wurde, "DotUhr.a". Wenn die nicht im 
Makefile stünde, müsste das "clean all"-Target wahrscheinlich auch so 
(ohne den initialen Bindestrich) durchgehen.

Hast Du irgendwo darum gebeten, daß diese Library erzeugt wird?

von Thomas S. (thomasschattat)


Angehängte Dateien:

Lesenswert?

Hi, danke für den Hinweis.
Was ich gemacht ghabe ist:
Neues Projekt, funktioniert. Dann meinen Code in die C-Datei reinkopiert 
und die beiden Header Dateien mit ins Projekt hinzugefügt.

Dann war das Problem da. Glaub das war auch schon ohne das hinzufügen 
der H Dateien.
Wo sollte diese Library denn ausgewählt worden sein?
Habe nur eine Datei DotUhr.C drin un die zwei H Dateien die aber anders 
heißen. Diese sind mit #include dabei.
Hänge mal einen Screenshot dran..

Da sehe ich keine library DotUhr.a. Wo kann ich das konfigurieren?

Gruß
Thomas

von Karl H. (kbuchegg)


Lesenswert?

Markus F. schrieb:
> So, wie's in deinem Makefile aussieht, ist die Datei, die er löschen
> will und die nicht erzeugt wird/wurde, "DotUhr.a".

Ich denke, dass da der Makefile Generator ganz einfach alle 
Dateiendungen durchgeht, die so anfallen. Er nimmt den Projektnamen und 
hängt dann einfach alle Endungen drann.

Durch das -rf sollte rm ja auch nicht abbrechen, wenn einige davon nicht 
vorhanden sind. Denn ein Makefile muss auch dann durchgehen, wenn ich 
die Ergebnisdateien selbst von Hand lösche.

von Thomas S. (thomasschattat)


Lesenswert?

So, hab das nochmal angesehen. Die Datei *.a wird garnicht erzeugt. Hab 
dann mal testweise eine andere Datei hinkopiert und diese dann *.a 
umbenannt.
Alle werden mit clean gelöscht, der Fehler bleibt. Nach dem Löschen sin 
nur noch zwei Dateien da: makedep.mk und makefile.

Dann neu Rebuild und alles ist wieder da.

Kann das jemand erklären?

Gruß
Thomas

von Karl H. (kbuchegg)


Lesenswert?

Thomas Schattat schrieb:
> So, hab das nochmal angesehen. Die Datei *.a wird garnicht erzeugt.

Logisch.
Du wirst ja wohl in den meisten Fällen auch keine Library erzeugen 
sondern ein ausführbares Programm.

.a ist die Endung für Libraries, also Dateien in denen bereits 
übersetzter Object Code gesammelt und für den Linker als Einheit 
zusammengestellt wird.

> Kann das jemand erklären?

Was ich an deine Stelle tun würde.

Du sagst, dass ein neues Projekt mit einem minimalistischen Code keine 
Probleme macht.
Dann würde ich mal hergehen und aus dem C-File so gut wie alles 
auskomentieren, so dass wieder nur das minimalistische main() übrig 
bleibt. Das muss dann wieder sauber durchgehen.
Denn nehm ich vielleicht die beiden Header Files wieder mit rein und 
probiere, ob noch alles durchgeht.
Und dann kommt sukzessive wieder Funktionalität hinzu, wobei ich mir 
jedesmal ansehe, ob noch alles klappt.


Seltsam ist das schon. Blöd ist nur, dass im Log nicht steht, welcher 
Fehler aufgetreten ist. Irgendwie will ich nicht glauben, dass der rm 
das Problem darstellt.

: Bearbeitet durch User
von Thomas S. (thomasschattat)


Lesenswert?

So, hab das mal versucht und alles immer weiter weg kommentiert.
Hier wie es ohne Problem funktioniert:

#include <avr/io.h>
//#include <avr/eeprom.h >
#include <avr/interrupt.h>
#include <util/delay.h>

#include <stdbool.h>
#include <string.h>
#include <avr/pgmspace.h>

Das Problem ist das Leerzeichen hinter eeprom.h, ich glaub es nicht!!
Hab erst eeprom.h mal rausgenommen, dann war das Problem weg. Wieder 
rein, da war es wieder. Dann fiel mir das Leerzeichen auf, weg damit und 
alles klar!

Was ein Mist. Danke an alle die sich Gedanken gemacht haben. Unglaublich 
!!

Gruß
Thomas

von Martin N. (kaktus2)


Lesenswert?

Ein ähnliches Problem hatte ich auch.... letztendlich lag es am 
Antiviren Programm.

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.