Forum: Mikrocontroller und Digitale Elektronik h und c file auslagern


von AVRe (Gast)


Lesenswert?

Hallo,

ich nutze AVR Studio. Im normalfall hat man ja alle Dateien die zu einem 
Projekt gehören innerhalb des Projektordners.

Nun will ich ein paar c und h Dateien bei anderen Projekten nutzen, 
diese aber nicht immer aktualisieren. Dh. ich würde die Dateien gerne 
zwei Ebenen höhrer verlegen.

Wenn ich z.b. nur eine config.h habe, in der lediglich #define's stehen, 
klappt es mit ../../config.h

Nun will ich aber auch c Dateien mit Funktionen zwei Ebenen höher mit 
dazu gehöriger .h Datei verlagern.

Wenn ich nun in meiner main.c die h Datei include mit ../../funktion.h 
dann sagt er mir "undefined reference to `funktionname'"

Es würde mich sehr freuen, wenn ihr mir sagt, wie das zu machen ist...

Schöne Grüße

von Ralf G. (ralg)


Lesenswert?

Das AVR-Studio hat in den Projekteinstellungen eine Seite 'Include 
Directories'. Da schreibst du alle Pfade rein und musst im Quelltext 
keine Kopfstände machen.

von guest (Gast)


Lesenswert?

Ralf G. schrieb:
> 'Include Directories'

Die Fehlermeldung "undefined reference..." hat nun aber nichts mit 
Includes zu tun, sondern kommt vom Linker. Vermutlich hat er einfach 
vergesssen das c-File zum Projekt hinzuzufügen und es damit überhaupt 
nicht kompiliert.

von Amateur (Gast)


Lesenswert?

Die fehlenden Referenzen kommen daher, dass der linke Typ, die vom 
H-File referierten Funktionen, nicht zur Zieldatei hinzufügen kann.
Die H-Datei kannst Du mittels "langem" Pfad oder fummeln an der Umgebung 
bekanntmachen. Das ist aber nur die halbe Miete.
Du musst sozusagen die, zur H-Datei gehörigen, C-Dateien kompilieren und 
das Ergebnis dem Linker vorsetzen.

von Ralf G. (ralg)


Lesenswert?

guest schrieb:
> Vermutlich hat er einfach vergesssen das c-File zum Projekt hinzuzufügen
Oder es wird eine 'function.h' aus einem anderen Ordner eingebunden, wo 
die entsprechende Funktion fehlt.
Edit:
Hmm, da gibt's eigentlich nur Warnungen bzw. andere Fehlermeldungen...

: Bearbeitet durch User
von AVRe (Gast)


Lesenswert?

Ok, ich versuche es mal mit einem Beispiel zu umschreiben.

Ich habe einen DS1632 Temperatur Sensor. Für diesen habe ich eine h und 
eine c datei angelegt. Die h Datei habe ich in der main.c mit #include 
"ds1632.h"

Nun will ich diese beiden Dateien zwei Ebenen darüber ablegen.

Nutze ich unter den Projektoptionen den Include Folder, erhalte ich die 
gleiche Fehlermeldung, wie wenn ich die h Datei durch einen relativen 
Pfad angebe.

guest schrieb:
> Vermutlich hat er einfach
> vergesssen das c-File zum Projekt hinzuzufügen und es damit überhaupt
> nicht kompiliert.

Das habe ich nicht gemacht. Und zwar weil wenn ich dies tue, kopiert das 
Programm mir die Datei aus den "zwei Ebenen oben drüber" ins Projekt. 
Und damit ist der Sinn des ganzen ja wieder verloren...

Gibt es hier eine andere Möglichkeit die Dateien dem Projekt 
hinzuzufügen. Versucht habe ich es über "rechtsklick aufs Projekt ==> 
ADD ==> Existing Item"

von Ralf G. (ralg)


Lesenswert?

AVRe schrieb:
> ich nutze AVR Studio.

Sicher?

AVRe schrieb:
> Und zwar weil wenn ich dies tue, kopiert das
> Programm mir die Datei aus den "zwei Ebenen oben drüber" ins Projekt.
> Und damit ist der Sinn des ganzen ja wieder verloren...

Das macht kein AVR-Studio

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ralf G. schrieb:
> Das macht kein AVR-Studio

 Doch.
 ATMEL-Studio macht es nicht aber AVR-Studio schon.

von AVRe (Gast)


Lesenswert?

Ich muss mich korrigieren. Ich nutze Atmel Studio. Hier werden die 
Dateien kopiert...

Gibt es hierzu eine Lösung?

von Ralf G. (ralg)


Lesenswert?

Marc V. schrieb:
> ATMEL-Studio macht es nicht aber AVR-Studio schon.

Genau umgekehrt!?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ralf G. schrieb:
> Marc V. schrieb:
>> ATMEL-Studio macht es nicht aber AVR-Studio schon.
>
> Genau umgekehrt!?

 Ich gebe es auf und gehe erst mal schlafen.
 Zweimal richtig gedacht aber falsch geschrieben innerhalb 20 min.

von AVRe (Gast)


Lesenswert?

Und wie ist jetzt die Lösung?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

AVRe schrieb:
> Und wie ist jetzt die Lösung?

Die Lösung wurde Dir doch schon mehrmals genannt: es reicht nicht aus, 
die Headerdatei einzubinden, sondern es müssen sowohl der betreffende 
C-Quellcode kompiliert als auch das Kompilat zu Deinem Projekt gelinkt 
werden.

Wenn Du die .c-Datei nicht in Deinem Projekt kompilieren willst, kannst 
Du das (natürlich mit entsprechenden kompatiblen 
Compiler-Einstellungen!) auch in einem separaten Projekt machen. Es ist 
halbwegs egal, ob Du dann die .o-Datei linkst oder erst noch eine 
Bibliothek daraus baust.

von AVRe (Gast)


Lesenswert?

Dann würde die Option "Include Folder" unter den Projekt Optionen keinen 
Sinn machen...

Es muss doch eine Möglichkeit geben, dass das Programm wie gewohnt 
compiliert wird,  nur dass die Dateien nicht im identischen Ordner 
liegen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

AVRe schrieb:
> Es muss doch eine Möglichkeit geben, dass das Programm wie gewohnt
> compiliert wird,  nur dass die Dateien nicht im identischen Ordner
> liegen.

Und noch einmal: es genügt NICHT, die Datei zu kompilieren!

von Cube_S (Gast)


Lesenswert?

Ich bin nicht sicher ob ich die Problematik hier wirklich richtig 
verstanden habe. Ich nutze aber selbst sehr wohl .h und .c in einem 
"Common"-Verzeichnis. Das ganze mit ATMEL Studio 7.

Header werden per Include-Directory in den Einstellunge aufgelöst.

Bei den .c Files gibt es die Möglicheit Dateien als Link hinzuzufügen. 
Beim Hinzufügen von vorhandenen Dateien hat der Button "Hinzufügen" in 
der Dateiauswahl einen kleinen Pfeil hinter dem sich das "Als Link 
hinzufügen" verbirgt. Diese Lösung gefällt mir ganz gut.

von grundschüler (Gast)


Lesenswert?

AVRe schrieb:
> Es muss doch eine Möglichkeit geben, dass das Programm wie gewohnt
> compiliert wird,  nur dass die Dateien nicht im identischen Ordner
> liegen.

ganz einfach, mach aus der "c"-Datei eine "h"-Datei, dann wird sie mit 
einfachem #include als Bestandteil der main.c compiliert.

von Mark B. (markbrandis)


Lesenswert?

grundschüler schrieb:
> ganz einfach, mach aus der "c"-Datei eine "h"-Datei, dann wird sie mit
> einfachem #include als Bestandteil der main.c compiliert.

Das klingt nun mehr nach Pfusch ;-)

von AVRe (Gast)


Lesenswert?

Cube_S schrieb:
> Ich bin nicht sicher ob ich die Problematik hier wirklich richtig
> verstanden habe. Ich nutze aber selbst sehr wohl .h und .c in einem
> "Common"-Verzeichnis. Das ganze mit ATMEL Studio 7.
>
> Header werden per Include-Directory in den Einstellunge aufgelöst.
>
> Bei den .c Files gibt es die Möglicheit Dateien als Link hinzuzufügen.
> Beim Hinzufügen von vorhandenen Dateien hat der Button "Hinzufügen" in
> der Dateiauswahl einen kleinen Pfeil hinter dem sich das "Als Link
> hinzufügen" verbirgt. Diese Lösung gefällt mir ganz gut.

OK, dass is schonmal sehr gut. Soweit klappts danke!

Nun habe ich aber einen c file, der einen h file einbindet, welcher im 
aktuellen Projekt liegt also im Projektordner.

dafür müsste ich den Pfad genau angeben also
"eins hoch" dann in den Projektordner
#include "../Projektordner/Files/file.h"

Wenn ich den Pfad angebe, klappts. Das Problem ist, ich müsste es immer 
wieder für jedes Projekt ändern. Gibt es hierfür einen Platzhalter, der 
so heißt wie der Projektordner? Sprich dass ich den pfad so ca angeben 
würde:

#include "../$(Projektfolder)/Files/file.h"

von Cube_S (Gast)


Lesenswert?

>Nun habe ich aber einen c file, der einen h file einbindet, welcher im
>aktuellen Projekt liegt also im Projektordner.

Löse ich auch über die Include-Directories. Da gibt's zusätzlich ein 
".."

von AVRe (Gast)


Lesenswert?

Wie meinst du das?

../ wäre einen Ordner nach oben...?!

von AVRe (Gast)


Lesenswert?

Ah ok, du  meinst es wie dus schreibst :P

Danke dir, klappt!

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.