Forum: Compiler & IDEs mehrere C files einbinden


von Hendrik E. (htrik)


Angehängte Dateien:

Lesenswert?

Moin,
hab en Problem mehrere C Files beim AVR Studio 4.16 einzubinden. Wenn 
ich das Unterprogramm in die main.c schreiben funktioniert es ohne 
Probleme. Beim Auslagern in ein anderen c File bekomme ich immer den 
gleichen Error angezeigt. (Steht in dem angehängten txt file)
Kann mir da jemand einen Rat geben?
Hab auch schon andere Beiträge gelesen aber bin nicht schlau draus 
geworden. Steh vll auch auf nem großen schlauch.

Gruß
Hendrik

von Sven P. (Gast)


Lesenswert?

Ich rate mal ganz blind:
Du hast die 'ausgelagerte' C-Datei nachher mit
1
#include "blabla.c"
eingebunden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Hab auch schon andere Beiträge gelesen aber bin nicht schlau draus
> geworden. Steh vll auch auf nem großen schlauch.
Die anderen (neuen, ausgelagerten) C-Files gehören ins Projekt (bzw. 
Makefile) eingebunden. Und nur die Funktionsköpfe werden dem C-File, in 
dem sie verwendet werden, bekannt gemacht (z.B. über Header-Dateien).

von Hendrik E. (htrik)


Lesenswert?

Sven P. schrieb:
> Ich rate mal ganz blind:
> Du hast die 'ausgelagerte' C-Datei nachher mit
>
1
> #include "blabla.c"
2
>
> eingebunden.


Ja das hab ich gemacht. Ist doch nicht falsch,oder?

Das man die neue C-Datei in den Makefile einbinden muss ist mir bekannt 
und beim AVR Studio 4.16 wird das auch automatisch gemacht. Hab 
nachgeschaut.

Gruß Hendrik

von Micha (Gast)


Lesenswert?

>Ja das hab ich gemacht. Ist doch nicht falsch,oder?
Doch ist es. Siehe:
Beitrag "Include-Problem in C"
Beitrag "Programm auf  mehrere C-Files aufteilen"
u.v.a.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ist doch nicht falsch,oder?
Doch: offenbar kommt der Compiler mit den Auswirkungen nicht zurecht :-/

Du mußt nur die Funktionsdefinitionen bekanntmachen, das Zusammenfügen 
wird über das Makefile vom Linker erledigt. Sieh dir doch einfach ein 
paar Projekte an, die andere gemacht haben, da darf mal schon mal 
spicken ;-)

von Oliver (Gast)


Lesenswert?

>Das man die neue C-Datei in den Makefile einbinden muss ist mir bekannt
>und beim AVR Studio 4.16 wird das auch automatisch gemacht. Hab
>nachgeschaut.

Ebend (tm).

Weil das Studio das schon automatisch macht, brauchst (bzw. darfst) du 
das File nicht noch extra per include in main einbinden. Der linker baut 
dir das alles schon zusammen, ganz automatisch.

Oliver

von Hendrik E. (htrik)


Lesenswert?

Oliver schrieb:
>>Das man die neue C-Datei in den Makefile einbinden muss ist mir bekannt
>>und beim AVR Studio 4.16 wird das auch automatisch gemacht. Hab
>>nachgeschaut.
>
> Ebend (tm).
>
> Weil das Studio das schon automatisch macht, brauchst (bzw. darfst) du
> das File nicht noch extra per include in main einbinden. Der linker baut
> dir das alles schon zusammen, ganz automatisch.
>
> Oliver

Ok also muss ich nur die neue C-Datei bei Source Files einbinden und 
sonst nichts mehr machen? Auch kein Header mehr erstellen?

Gruß Hendrik

von Karl H. (kbuchegg)


Lesenswert?

Doch Header brauchst du.

In C gilt die Regel: Verwendet werden darf nur was bekannt ist

wenn du also einen Funktionsaufruf machen willst, muss der Compiler 
wissen, dass es diese Funktion gibt.
Das erreicht man mit einem Prototypen (einer Funktionsdeklaration)

File: Funktion.h
1
void foo( void );

File: Funktion.c
1
#include "Funktion.h"
2
3
void foo( void )
4
{
5
  // mach was
6
}

File: main.c
1
#include "Funktion.h"
2
3
int main()
4
{
5
  foo();
6
}

Funktion.c und main.c fügst du zu den Source Files im AVR STudio hinzu. 
Funtion.h fügst du im AVR Studio zu den HEader Files hinzu

Siehe auch:
http://www.mikrocontroller.net/articles/FAQ#Ich_hab_da_mehrere_.2A.c_und_.2A.h_Dateien._Was_mache_ich_damit.3F

von Hendrik E. (htrik)


Lesenswert?

Ok. So klappts.
Jetzt hab ich nur noch ne Frage.
wenn ich jetzt im Main.c z.B. schreibe #define TAKT 8000000UL und will 
dann in der anderen C-Datei auf die Konstante TAKT zugreifen funkt das 
auch nicht!?
Wenn der Compiler das Einfügen der neuen C-Datei selbst übernimmt, wann 
bindet er die dann in die Main.c ein. Ich müsste ja dann bevor der 
Compiler die neue C-Datei einbindet die Konstante definieren, damit das 
Unterprogramm in der neuen C-Datei über TAKT bescheid weis.
Oder geht das nur indem ich #define TAKT 8000000UL in die neue C-Datei 
schreibe?

Gruß
Hendrik

von Hendrik E. (htrik)


Lesenswert?

Ok simbler aber doofer Fehler. Bin halt noch en newbie!:)
Hab die neue Header-Datei nicht in der zweiten C-Datei eingefügt. Doof 
aber jetzt gehts!
Danke für eure schnelle Hilfe!!
Grüße
Hendrik

von Karl H. (kbuchegg)


Lesenswert?

Hendrik Ebert schrieb:

> wenn ich jetzt im Main.c z.B. schreibe #define TAKT 8000000UL und will
> dann in der anderen C-Datei auf die Konstante TAKT zugreifen funkt das
> auch nicht!?

Logisch.
C-Dateien sind voneinander unabhängig.
Wenn der Compiler eine C-Datei compiliert, weiß er nicht was in einer 
anderen C-Datei enthalten ist.

> Wenn der Compiler das Einfügen der neuen C-Datei selbst übernimmt,

Das macht nicht der COmpiler.
Dem AVR Studio musst du die C-Datei nur deshlab bekannt geben, damit 
AVR-Studio dafür sorgt, dass auch diese Datei compiliert wird.

C selbst kennt keine Projektverwaltung. Das macht erst die IDE, in 
deinem Fall AVR Studio. Insbesonder weiss der Compiler nichts von einem 
Projekt. Für ihn existiert immer nur das eine C-File welches er gerade 
compiliert.

> Compiler die neue C-Datei einbindet die Konstante definieren, damit das
> Unterprogramm in der neuen C-Datei über TAKT bescheid weis.

Solche übergreifenden Konstanten schreibt man normalerweise in eine 
Header-Datei, die dann überall #include-d wird.

Im Falle der Taktfrequenz gibt es auch noch folgende Möglichkeit:
In den Projekteinstellungen im AVR Studio gibst du deine Taktfrequenz 
an. AVR-Studio sorgt dann dafür, dass für jedes C-File, welches 
compiliert wird, die Makrokonstante F_CPU mit genau diesem Wert zur 
Verfügung steht.

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.