www.mikrocontroller.net

Forum: Compiler & IDEs mehrere C files einbinden


Autor: Hendrik Ebert (htrik)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Ich rate mal ganz blind:
> Du hast die 'ausgelagerte' C-Datei nachher mit
>
> #include "blabla.c"
> 
> 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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
void foo( void );

File: Funktion.c
#include "Funktion.h"

void foo( void )
{
  // mach was
}

File: main.c
#include "Funktion.h"

int main()
{
  foo();
}

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_ha...

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.