Möchte im PRinzip nur eine Datei inkludieren.
z.b.
-----Hauptdatei.c-------
#include <avr/test.h>
foo();
----------------------
-----test.h-------
#ifndef FOO_H
#define FOO_H
foo();
#endif
----------------------
--------test.c---------
foo(){
return true;
}
------------------------
Problem, wie geht das im AVR Studio ?
Mache es bisher so:
- Neues gcc Projekt anlegen
- Hauptdatei im Verzeichnisbaum unter Sourcedateien anlegen
- Alle Dateien schreiben und speichern
- Im Dateibaum unter Sourcedateien zusätzlich die Datei test.c laden
- compelieren
Beim compelieren wills aber nicht durchlaufen Mit dem Fehler
make: *** No rule to make target
`..//C/tool/WinAVR/avr/include/avr/test.c', needed by `test.o'. Stop.
Ist sicher nichts weltbewegendes, komme aber nicht drauf welche Optionen
im AVR Studio ggf. anders eingestellt werden müßen.
> Wo ist denn hier source code im Include Verzeichnis ?
Du arbeitest offensichtlich mit privaten Dateien im
SDK-Include-Verzeichnis (oder was soll die Zeile #include
<avr/test.h>?). So was macht man nicht. Ich vermute, Du hattest auch mal
"test.c" dort und vieleicht steht das noch in der Projekt-Konfigration.
Packe das Projekt mal und hänge es hier an, dann muss man nicht raten.
Ich habe es mal ausprobiert, keine Probleme, siehe Ahhang. Ich hoffe,
dass Deine Dateien reine Testdateien waren, denn die stecken voller Mist
(Prototyp in Hauptdatei zusätzlich zum inkludierten Header, kein main(),
Rückgabetyp nicht deklariert, fehlendes extern).
Ja, stimmt in das AVR Verzeichnis habe ich foo.h und foo.c kopiert
test.c ist das HAuptprogramm selbst das sie inkludiert. In die
inkludierten Dateien sollen Funktionen rein die häufig brauche, deswegen
sollten die in das AVR Verzeichnis rein, sozusagen als Ergänzung.
Ja, mit dem Beispiel gehts, aber wie gesagt die Dateien liegen ja nicht
im eigentlichen Programmverzeichnis mit drin, sondern dort wo auch die
anderen ganzen AVR funktionen mit gesammelt sind
Also Frage: Wie kann ich h und c datei inkludieren wenn sie nicht im
Programmverzeichnis liegt, sondern bei den anderen AVR includedateien.
Anbei die Dateien. (test.c und h.c einfach ins AVR Verzeichnis
...winAVR/AVR/include/avr kopieren)
Wie gesagt passiert dann folgendes
#include <avrlib/test.h>
int main(){
return(0);
}
Führt zur oben genannten Fehlermeldung. Wenn die test.c und h im
Eigentlichen Programmpfad liegen gehts, aber da sist ja nicht gewollt.
> die Dateien liegen ja nicht im eigentlichen Programmverzeichnis mit drin,
sondern dort wo auch die anderen ganzen AVR funktionen mit gesammelt sind
Dort haben sie rein gar nichts zu suchen. Das SDK ist off-limits.
Normalerweise legt man Header in das Projektverzeichnis oder ein
Unterverzeichnis davon ("includes").
Wenn Du projektübergreifend Header sammeln willst, dann lege sie in
einem eigenen Verzeichnis ab und trage den Pfad dahin als
Include-Suchpfad ein (in AVRStudio auf der Konfigurationsseite "Include
Directories"). Dann kannst Du überall include <foo.h> schreiben - ohne
das SDK zu vermurksen.
C-Dateien zu sammeln ist nicht üblich (man linkt lieber mit den
übersetzten Dateien -> Link Libraries) aber wenn Du es machen willst,
geht es auch per Suchpfad-Angabe. Um den Projektbaum übersichtlich zu
halten und nicht jede externe Datei dort eintragen zu müssen, erzeuge
ich gerne eine Datei "modules.c" im Projekt, in der die
Sourcecode-Module inkludiert werden. "modules.c" sieht dann z.B. so aus:
#include <defs.h>
// include support code for hardware units
#include <ports.c>
#include <lcd.c>
#include <owi.c>
usw.
(Voraussetzung ist, dass die Module untereinander keine Konflikte haben,
d.h. einheitliche Definitionen von Strukturen, Typen usw., ansonsten
müssen sie einzeln übersetzt werden).
Danke schonmal für die ausführliche Antwort.
Habe den includepfad in den Optionen vom AVR Studio zwar eingetragen,
trotzdem erhalte ich die Fehlermeldung beim compelieren. Hintergrund ist
eigentlich das ich eine Sammlung mit Funktionen projektübergreifend
sammeln möchte und nicht alle Files immer ins Projektverzeichnis
kopieren will. Habe jetzt ein separates Verzeichnis gemacht das im
gleichen Order wie avr liegt, aber avrlib heißt ..> #include
<avrlib/test.h>
Das einzige was funktioniert ist wenn ich in der h datei die c datei
inkludiere, aber das ist ja eigentlich nicht so gedacht. Würde
eigentlich lieber sauberen Code schreiben.
ggf. noch eine andere Idee woran es liegen könnte ? (Vielleicht einfach
noch mal selbst versuchen)
Ich kann Deine Probleme nicht nachvollziehen. Das Archiv im Anhang
enthält ein Verzeichnis "Eigene Projekte" (ich würde es nach "Eigene
Dateien" kopieren und "Eigene Dateien" auf eine andere Partition als die
System-Partition legen). "Eigene Projekte" enthält ein Test-Projekt, das
Test-Sourcecode und Test-Header aus einem Sammel-Ordner "module"
verwendet.
> trotzdem erhalte ich die Fehlermeldung beim compelieren
Das heisst übrigens kompilieren oder (denglish) compilieren.
Interessantes Problem.
Dein Code läuft prima...genauso wie es sollte.
Mein Code läuft scheinbar deswegen nicht, weil ich mein includeordner
auf einer anderen Festplatte habe. Solange der Ordner mit meinen
gesammelten Funktionen auf der gleichen Festplatte liegt geht alles gut.
Der Fehler tritt erst dann auf wenn die test.c und test.h auf einem
anderen Laufwerk liegen als die Projektfiles...
Wieso auch immer das auftritt. Ist aber egal, habe meine Dateien einfach
mit auf das Laufwerk kopiert wo die Projektfiles liegen und jetzt geht
alles.
Nehme mal an das AVR Studio da was falsches in die Makefiles einträgt.
Wens interessiert, die Makefiles unterscheiden sich dann in folgender
Zeile:
test.o: ../../../../../../libs/test.c ist ok, ordner liegt auf gleichem
Laufwerk wie Projektdaten in diesem Fall beides auf Laufwerk e:
und beim beispiel wo es nicht funktioniert steht dann in der MAkefile
test.o: ..//C/libs/test.c Die zu inkludierenden DAteien liegen jetzt
auf C:\libs und die Projektfiles auf e: und schon gehts nicht mehr
Naja wie gesagt es läuft jetzt....auf jeden Fall vielen, vielen Dank für
die gute Unterstützung.