Eigene Bibliotheken/Headerdateien erstellen / externe Funktion?!
-
chmbw schrieb:
ich binde in cb.c ja noch stdio.h ein weil er sonst meckert...so binde ich die aber doch auch doppelt ein?! Dafür müsste ich dann doch auch noch einen Guard basteln?!
Nö, stdio.h hat seine eigenen guards. Einfach mal reinsehen.
-
hmmm
also ich habe cb.h ins Verzeichnis zu den ganzen anderen Standardheadern getan, und es mit
#include <cb.h>
eingebunden. Die spitzen klammern müssten doch so stimmen?!
aussehen tut er so:#ifndef CB_H_INCLUDED #define CB_H_INCLUDED extern void cb(void); #endif // CB_H_INCLUDED
meine cb.c sieht so aus:
#include <cb.h> #include <stdio.h> void cb(void) { int c=0; while ( (c=getchar()) != EOF && c != '\n'); }
In welches Verzeichnis muss ich cb.c jetzt schieben, bzw. wie muss ich cb.h sagen, dass mein cb.c "da und da" liegt, bz. was müsste ich beim einbinden beachten?!
-
chmbw schrieb:
eingebunden. Die spitzen klammern müssten doch so stimmen?!
Ja.
chmbw schrieb:
In welches Verzeichnis muss ich cb.c jetzt schieben, bzw. wie muss ich cb.h sagen, dass mein cb.c "da und da" liegt, bz. was müsste ich beim einbinden beachten?!
Du musst einem Header nicht sagen, wo die c-Files sind. Wo ein c-File ist, ist egal.
Mach jetzt am besten eine Bibliothek (libcb.a) aus cb.c, und leg sie in das Verzeichnis, in dem die anderen lib*.a liegen.
-
so, ich habe jetzt die Headerdatei wie beschrieben, die libcb.a hab ich auch erstellt und ins Standard-Verzeichnis gepackt, meckern tut er trotzdem noch immer..Ich hab rumprobiert, aber keine Ahnung mehr was ihm nicht passt
-
Ich vermute, du hast ne IDE? Die muss auch libcb.a kennen und ihren Pfad.
-
ja, ich nutze Code::Blocks als IDE.
Wie geb ich libcb.a denn an, über include meckert er^^
edit: also die libcb.a ist im selben Verzeichnis wie die Standardlibs auch...
-
Da liegt sie schonmal gut, aber die IDE muss das auch wissen. Damit sie das dem Linker verklickern kann.
Ich kenne mich mit deiner IDE nicht aus, aber die meisten haben irgendwo ne Möglichkeit, den Namen der einzubindenden Bibliothek anzugeben.
-
Big Brother schrieb:
Ich vermute, du hast ne IDE? Die muss auch libcb.a kennen und ihren Pfad.
Er hat Code::Blocks mit gcc und Windows.
Man muss dem Compiler nur noch sagen, dass er diese Bibliothek verlinken soll, den Pfad muss man nicht dazusagen, wenn sie dort lebt, wo auch die Standard-Bibliotheken leben. Der Aufruf ist dann
gcc ... -lcb ...
. Der gcc sieht den-l
-Schalter und weiss, dass der Name der Bibliothekcb
ist. Auf den Dateinamenlibcb.a
kommt er dann von selbst.Nehmen wir an, cb.h und libcb.a liegen in den jeweiligen Compiler-Verzeichnissen. Folgende Testdatei:
/* helloworld.c */ #include <stdio.h> #include <cb.h> int main(void) { cb(); puts("hello, world"); return 0; }
sollte man dann so übersetzen können:
gcc -c helloworld.c -o helloworld.o gcc helloworld.o -o helloworld.exe -lcb
Die erste Zeile kompiliert, die zweite linkt.
Mit Code::Blocks kann man Bibliotheken zum Linken auch via GUI angeben: unter Projekt - Build Options... - Linker Settings
Alles ungetestet.
-
top, vielen lieben Dank für die antworten! also wenn ich Code::Blocks jetzt unter Projekt - Build Options... - Linker Settings sage, dass libcb.a mit einbezogen werden soll, gehts.
Mein Wunsch wär jetzt aber, dass ich, wenn ich beispielsweise mein System neu aufsetze oder irgendeine ähnliche Situation habe, nur die cb.h und libcb.a in die Stammverzeichnisse stecken muss, meine cb.c irgendwo anders lager, und dann einfach über #include <cb.h> einbinden kann. Oder muss ich immer jetzt angeben, dass libcb.a mit eingebunden werden muss?! Kann man das nicht irgendwie noch mit in die Headerdatei packen?
-
chmbw schrieb:
Mein Wunsch wär jetzt aber, dass ich, wenn ich beispielsweise mein System neu aufsetze oder irgendeine ähnliche Situation habe, nur die cb.h und libcb.a in die Stammverzeichnisse stecken muss, meine cb.c irgendwo anders lager, und dann einfach über #include <cb.h> einbinden kann. Oder muss ich immer jetzt angeben, dass libcb.a mit eingebunden werden muss?! Kann man das nicht irgendwie noch mit in die Headerdatei packen?
Nein, das geht nicht. Im Header steht nur Standard C, das weiss nicht, wie der Linker bedient werden muss (vulgo ist portabel über Systeme und Compiler). Dem Linker muss man für jedes Projekt aufs neue sagen, was er alles verlinken soll. Das ist aber auch gut so, weil jede Bibliothek die Grösse der exe aufbläht, und es sind ja nicht alle Bibliotheken so klein. Die libgc.a vom Böhm-GC hat zum Beispiel auf meinem System ca. 1MB, deshalb wird jede exe, die ich statisch dagegen linke, um ca. 1MB grösser.
Deshalb haben die gcc-Leute den Parameter für das Linken auch so kurz gemacht. Der Aufwand, in das Fenster "other linker options" des Linker-Settings-Dialogs von C::B zu schreiben:
-lcb
, hält sich ja wirklich in Grenzen. Vielleicht kann man bei C::B auch Defaults für jedes neue Projekt setzen, keine Ahnung. Ich verwende am liebsten Makefiles, da hab ich einfach ein paar Vorlagen für solche Fälle.
-
klasse, dann hab vielen Dank für deine tolle Hilfe!
-
chmbw schrieb:
klasse, dann hab vielen Dank für deine tolle Hilfe!
Klar.
chmbw schrieb:
Das ist aber auch gut so, weil jede Bibliothek die Grösse der exe aufbläht, und es sind ja nicht alle Bibliotheken so klein. Die libgc.a vom Böhm-GC hat zum Beispiel auf meinem System ca. 1MB, deshalb wird jede exe, die ich statisch dagegen linke, um ca. 1MB grösser.
Hmm, das war nur die halbe Wahrheit. Wenn printf() nicht aufgerufen wird, muss der Linker den Code von printf() natürlich nicht in die exe geben. Es dürfte also nichts ausmachen, jedes Projekt gegen libcb.a zu linken (ausser dass das Linken länger dauert). Bei Code::Blocks kann man Linker-Optionen für jedes Projekt unter Settings - Compiler and debugger... - Linker settings machen.