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
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.
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.
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.
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...
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"
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
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.
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.
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.
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!
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.
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.
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 ;-)
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"
>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
".."