eigene header-files
-
Hallo,
ich beschäftige mich mal wieder etwas mit C und tue mich immer noch mit dem Linker etwas schwer.
Ich hoffe, dass mir hier jemaden erklären kann, wie ich ein Projekt mit mehreren Dateien richtig compiliere.compiler: gcc
os: linux (fedora)
ide: keineIch habe 3 Dateien im Ordner source:
source/ . .. main.c meinheader.h meinheader.c bin/ . .. main
- aus denen ich main im Stammverzeichnis compilieren will.
mein Befehl:
gcc source/main -o main -g -Wall -std=c99
dabei bekomme ich aber die Fehlermeldung, "undefined reference to 'func1'".
Also eine Funktion aus meinheader.h bzw meinheader.c ist nicht bekannt.wie mache ich es richtig?
Muss ich mitgcc -c source/meinheader.c -o bin/meinheader.o
erst meinen header compilieren
und dann mit
gcc source/main -o main -L ./bin -l myheader.o
die Dateien bekannt machen?
freue mich auf eure Antworten.
ps:
main.c beginnt mit#include <stdio.h> #include "meinheader.h" int main(int argc, char *argv[]) {
-
gcc source/main.c source/meinheader.c -o main
-
Danke, das hat natürlich besten funktioniert.
Jetzt stellt sich mir aber eine weitere Frage:
Angenommen ich würde myheader.c nicht jedes Mal neu compilieren wollen. Müsste es dann nicht auch funktionieren, wenn ich mitgcc -c source/myheader.c -o bin/myheader.o
meinen Header einmal compiliere und dann mit
gcc source/main.c -o main -g -Wall -std=c99 -lmyheader.o -L ./bin
dem Linker bekannt mache und so dann zu main.c hinzufüge?
Alles was ich in diese Richtung probiert habe, hat nicht funktioniert.
Habe ich da etwas falsch verstanden oder stehe ich nur etwas auf dem Schlauch?Wie müssen die Optionen für den Linker lauten?
-
gcc source/main.c -o main -g -Wall -std=c99 ./bin/myheader.o
Das -lirgendwas steht nämlich für "Suche eine Datei libirgendwas.a in den Pfaden für Bibliotheken (zu denen auch der -L-Pfad gehört)". Deine myheader.o passt nicht zu diesem Muster.
-
.keen schrieb:
Angenommen ich würde myheader.c nicht jedes Mal neu compilieren wollen
Daher benutzt man dafür auch ein makefile (z.B. mittels make - schau dir mal das "Beispiel für ein Makefile" an ;-), so daß die Objektdateien nur bei Bedarf neu erstellt werden und der Linker dann einfach diese Objektdateien zusammenbindet.
PS: Eines meiner ersten C Programme damals auf dem Amiga (so ca. 1990) war ein Programm namens "makemakefile", mit dem ich makefiles generiert habe (wo man dann auch nur noch die InputFiles sowie ein paar Compiler- und Linkeroptionen angeben mußte). Ich hatte damals auch noch mit einer vorkompilierten Headerdatei gearbeitet (da das Kompilieren doch recht lange gedauert hat - das größte Projekt damals bestand aus ca. 20 Dateien, welche zusammen etwa 20 Minuten zum Kompilieren benötigt hatten!).