Eigene Bibliotheken/Headerdateien erstellen / externe Funktion?!
-
chmbw schrieb:
ich muss gestehen mit dynamischen linken habe ich mich NOCH nicht wirklich intensiv auseinander gesetzt...
Du kannst den Code cb.c ja auch statisch verlinken. Das macht sicherlich kaum einen Unterschied, solange es nur so wenig Code ist. Dynamisches Linken muss im Vergleich dazu noch Rücksicht auf das System nehmen.
chmbw schrieb:
auch wenn ich mir bei der Frage ein wenig doof vorkomme...wie genau soll ich das machen?!
Finde zuerst einmal heraus, wie man auf deinem System eine Bibliothek aus einer Objektdatei macht (das sollte nicht schwer sein). Dann leg diese Datei irgendwo ab, zum Testen vielleicht in das Verzeichnis, in dem die Standard-Bibliotheken des Compilers leben. Dann sollte der Rest ganz einfach sein.
Mach am besten einen neuen Thread im Compiler-Forum, wenn du spezielle Fragen zu System und Compiler hast.
-
Vielleicht willst du noch ein wenig auf Wikipedia lesen:
http://en.wikipedia.org/wiki/Object_file
http://en.wikipedia.org/wiki/Library_(software)wäre ein guter Anfang.
-
ich benutze momentan Windows 7 64bit und als compiler die akutelle Version von Code::Blocks.
-
chmbw schrieb:
ich benutze momentan Windows 7 64bit und als compiler die akutelle Version von Code::Blocks.
Code::Blocks ist kein Compiler sondern eine IDE. Vemutluch verwendest du den gcc Compiler für Windows.
-
chmbw schrieb:
ich benutze momentan Windows 7 64bit und als compiler die akutelle Version von Code::Blocks.
Na dann rtm, oder:
http://www.adp-gmbh.ch/cpp/gcc/create_lib.htmlUnd ab ins Compiler-Forum.
-
vielen dank, dann weiß ich jetzt wo ich nachschlagen / fragen muss etc
-
ich hab jetzt nochmal ein wenig damit rumgespielt,aber jetzt folgendes Problem:
ich habe eine headerdatei cb.h:
extern void cb(void);
und eine Datei cb.c
#include "cb.h" #include <stdio.h> void cb(void) { int c=0; while ( (c=getchar()) != EOF && c != '\n'); }
#include <stdio.h> #include <stdlib.h> #include "C:/Users/Michael/CodeBlocks/Projekte/cbtest/cb.h" int main() { char a, b; printf("Bitte Buchstaben eingeben\n"); scanf("%c",&a); cb(); printf("2.Buchstabe\n"); scanf("%c",&b); cb(); printf("\n1.=%c 2.=%c\n\n",a,b); return 0; }
wenn ich jetzt die Datei cb.c mit ins Projekt einbeziehe, dann klappts, aber auch wenn ich die Headerdatei cb.h nicht mit einbeziehe. Wenn die Datei nicht im Projekt mit dabei ist, meckert er, dass er cb nicht kennt...müsste das aber nicht theoretisch trotzdem gehen? Ich als Compiler GNU-CC und als IDE CodeBlocks. Vielen Dank im Voraus!
-
chmbw schrieb:
wenn ich jetzt die Datei cb.c mit ins Projekt einbeziehe, dann klappts, aber auch wenn ich die Headerdatei cb.h nicht mit einbeziehe. Wenn die Datei nicht im Projekt mit dabei ist, meckert er, dass er cb nicht kennt...
Leg den Header in ein globales Include-Verzeichnis. Und mach endlich include guards!
-
zu befehl^^
edit: globales include-verzeichnis = verzeichnis wo auch sdtio.h usw liegen?!
edit2:
jetzt mit include guards:
#ifndef CB_H_INCLUDED #define CB_H_INCLUDED extern void cb(void); #endif // CB_H_INCLUDED
-
chmbw schrieb:
zu befehl^^
Wäre halt eine gute Idee.
chmbw schrieb:
edit: globales include-verzeichnis = verzeichnis wo auch sdtio.h usw liegen?!
Das ist eines davon. Man kann die Verzeichnisse global über eine Umgebungsvariable einstellen (INCLUDE_PATH oder so ähnlich), oder über einen Schalter beim Aufruf des Compilers.
Edit:
Wenn du die include guards nicht machst, kann es mühsam werden, sobald einige Header einander zyklisch #includen. Dann müsstest du dir jedes mal über die Reihenfolge den Kopf zerbrechen. Wenn du sie machst, lösen sich solche Probleme ganz von selbst.
-
da fällt mir noch eine Frage ein:
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?!
-
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?