Forum: Compiler & IDEs Makefile und Unterverzeichnisse


von Christoph Daun (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Vielleicht kann mir jemand weiterhelfen. Ich benutze derzeit den IAR AVR 
compiler. Nun würde ich gerne auf den GCC umsteigen. Bzw. jederzeit 
zwischen beiden wechseln können. Derzeit habe ich folgende Probleme:

1. Mein Sourcode ist in mehrere Domains aufgeteilt:
Source
      -->ChassInf/CHASSINF.c
      -->ECU/Adc.c
            /AnalogSwitch.c
            /ECU/ECU.c
            /Ports.c
            /Spi.c
            /Timer.c
      -->FaultMan/FaultMan.c
                 /MonitorStatus.c
      -->InfoBase/InfoBase.c
      -->IPC/IPC.c
      -->NVMEM/NVMEM.c
      -->OS/OS.c
           /main.c
      -->SandA/ERD.c
              /Motor.c
              /SandA.c
              /Switch.c

2. Weiterhin befinden sich in der domain OS noch Assembler Dateien die 
auch zum Quellcode gehoeren.

3. main() befindet sich in der main.c.
   Die main.c ist aber nicht die Datei die als erstes ausgefuehrt wird. 
Sondern dies ist die Startup.asm!


Fragen:
Kann ich dies ohne weiteres compilieren? Oder müssen alle Source Dateien 
in einem Ordner liegen?

Was mache ich falsch?
Ich erhalte momentan den Fehler:

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 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.

Compiling C: OS/main.c
avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -
funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wunde
f -Wa,-adhlns=/OS/main.lst  -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d 
OS/main
.c -o /OS/main.o
OS/main.c:117: warning: return type of 'main' is not `int'
Assembler messages:
FATAL: can't create /OS/main.o: No such file or directory

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Was mache ich falsch?

Du versuchst, deine Sourcedateien mit absoluten Pfadnamen anzugeben,
die Suche beginnt also in der Wurzel des Dateisystems statt im
aktuellen Verzeichnis.  Dort wird diese Datei dann nicht gefunden.

von Christoph Daun (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

und vielen Dank für die Antwort.

Ich habe das Makefile jetzt geändert:

# List C source files here. (C dependencies are automatically 
generated.)
SRC += ./OS/main.c
SRC += ./Chassinf/chassinf.c
SRC += ./ECU/Adc.c
SRC += ./ECU/AnalogSwitch.c
SRC += ./ECU/ECU.c
SRC += ./ECU/Ports.c
SRC += ./ECU/Timer.c
SRC += ./FaultMan/FaultMan.c
SRC += ./FaultMan/MonitorStatus.c
SRC += ./InfoBase/InfoBase.c
SRC += ./IPC/IPC.c
SRC += ./NVMEM/NVMEM.c
SRC += ./OS/main.c
SRC += ./OS/OS.c
SRC += ./ERD/ERD.c
SRC += ./ERD/Motor.c
SRC += ./ERD/SandA.c
SRC += ./ERD/Switch.c


Die Datei make.exe befindet sich wie oben beschrieben im Ordner Source. 
Jetzt erhalte ich folgende Fehlermeldung:
.
.
.
.
.
 storage class
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: error: syntax error before 
"DDRB"
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: warning: type defaults to `int' 
in decl
aration of `DDRB'
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: warning: data definition has no 
type or
 storage class
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: error: syntax error before 
"PINB"
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: warning: type defaults to `int' 
in decl
aration of `PINB'
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: warning: data definition has no 
type or
 storage class
./OS/main.c:121: warning: return type of 'main' is not `int'
make: *** [/./OS/main.o] Error 1

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christoph Daun wrote:

> SRC += ./OS/main.c
1
SRC += OS/main.c
hätte es sicher auch getan.

>  storage class
> ./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: error: syntax error before
> "DDRB"

Sieht so aus, als hättest du einige grundlegende Dinge hier daneben
geschrieben.  Das kannst du aber nur durch Review deines Sourcecodes
lösen.  Vermutung: hast du <avr/iom88.h> statt <avr/io.h> included?

> ./OS/main.c:121: warning: return type of 'main' is not `int'

Entsprechend dem C-Standard hat main() den Rückkehrwert `int'.

von Christoph Daun (Gast)


Lesenswert?

Ich vermute gerade , dass es bei IAR Unterschiede in der iom88.h gibt. 
Wahrscheinlich sind bestimmte libaries auch anders.
Also der von mir programmierte code läuft unter IAR einwandfrei. Wobei 
ich darauf geachtet habe, nur Standard C code zu verwenden.

>>Vermutung: hast du <avr/iom88.h> statt <avr/io.h> included?

Warum sollte ich denn nur die io.h includieren und nicht die iom88.h?

von Wolfram (Gast)


Lesenswert?

>Also der von mir programmierte code läuft unter IAR einwandfrei. Wobei
>ich darauf geachtet habe, nur Standard C code zu verwenden.

Eine Headerdatei die die Prozessorperipherieregister oder Interrupts 
beschreibt ist mit 99% Sicherheit Compilerspezifisch.

>Warum sollte ich denn nur die io.h includieren und nicht die iom88.h?
Das findest du raus wenn du die avrlibc Dokumentation liest, die ist 
Pflichtlektüre.

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.